roulette/types/types.go

116 lines
2.0 KiB
Go
Raw Normal View History

/*
Copyright © 2023 Seednode <seednode@seedno.de>
*/
package types
import (
"path/filepath"
"slices"
"strings"
)
var SupportedFormats = &Types{
2023-09-14 22:37:22 +00:00
Extensions: make(map[string]Type),
}
type Type interface {
Css() string
Title(rootUrl, fileUri, filePath, fileName, prefix, mime string) string
Body(rootUrl, fileUri, filePath, fileName, prefix, mime string) string
Extensions() map[string]string
2023-09-14 22:37:22 +00:00
MimeType(string) string
Validate(filePath string) bool
}
type Types struct {
2023-09-14 22:37:22 +00:00
Extensions map[string]Type
}
func (t *Types) Add(format Type) {
2023-09-14 22:37:22 +00:00
for k := range format.Extensions() {
_, exists := t.Extensions[k]
if !exists {
2023-09-14 22:37:22 +00:00
t.Extensions[k] = format
}
}
}
2023-09-14 22:37:22 +00:00
func (t *Types) FileType(path string) Type {
fileType, exists := t.Extensions[filepath.Ext(path)]
if exists {
2023-09-14 22:37:22 +00:00
return fileType
}
2023-09-14 22:37:22 +00:00
return nil
}
func (t *Types) Register(format Type) {
t.Add(format)
}
func (t *Types) Validate(path string) bool {
format, exists := t.Extensions[filepath.Ext(path)]
if !exists {
return false
}
return format.Validate(path)
}
func (t *Types) GetExtensions() string {
var output strings.Builder
extensions := make([]string, len(t.Extensions))
i := 0
for k := range t.Extensions {
extensions[i] = k
i++
}
slices.Sort(extensions)
for _, v := range extensions {
output.WriteString(v + "\n")
}
return output.String()
}
func (t *Types) GetMimeTypes() string {
var output strings.Builder
2023-09-14 22:37:22 +00:00
var mimeTypes []string
2023-09-14 22:37:22 +00:00
for _, j := range t.Extensions {
extensions := j.Extensions()
for _, v := range extensions {
mimeTypes = append(mimeTypes, v)
}
}
2023-09-14 22:37:22 +00:00
mimeTypes = removeDuplicateStr(mimeTypes)
slices.Sort(mimeTypes)
for _, v := range mimeTypes {
output.WriteString(v + "\n")
}
return output.String()
}
2023-09-14 22:37:22 +00:00
func removeDuplicateStr(strSlice []string) []string {
allKeys := make(map[string]bool)
list := []string{}
for _, item := range strSlice {
if _, value := allKeys[item]; !value {
allKeys[item] = true
list = append(list, item)
}
}
return list
}