mirror of
https://github.com/steveiliop56/tinyauth.git
synced 2025-10-28 12:45:47 +00:00
108 lines
1.8 KiB
Go
108 lines
1.8 KiB
Go
package decoders
|
|
|
|
import (
|
|
"reflect"
|
|
"regexp"
|
|
"strings"
|
|
|
|
"golang.org/x/text/cases"
|
|
"golang.org/x/text/language"
|
|
)
|
|
|
|
func normalizeKeys[T any](input map[string]string, root string, sep string) map[string]string {
|
|
knownKeys := getKnownKeys[T]()
|
|
normalized := make(map[string]string)
|
|
|
|
for k, v := range input {
|
|
parts := []string{"tinyauth"}
|
|
|
|
key := strings.ToLower(k)
|
|
key = strings.ReplaceAll(key, sep, "-")
|
|
|
|
suffix := ""
|
|
|
|
for _, known := range knownKeys {
|
|
if strings.HasSuffix(key, known) {
|
|
suffix = known
|
|
break
|
|
}
|
|
}
|
|
|
|
if suffix == "" {
|
|
continue
|
|
}
|
|
|
|
parts = append(parts, root)
|
|
|
|
id := strings.TrimPrefix(key, root+"-")
|
|
id = strings.TrimSuffix(id, "-"+suffix)
|
|
|
|
if id == "" {
|
|
continue
|
|
}
|
|
|
|
parts = append(parts, id)
|
|
parts = append(parts, suffix)
|
|
|
|
final := ""
|
|
|
|
for i, part := range parts {
|
|
if i == 0 {
|
|
final += kebabToCamel(part)
|
|
continue
|
|
}
|
|
final += "." + kebabToCamel(part)
|
|
}
|
|
|
|
normalized[final] = v
|
|
}
|
|
|
|
return normalized
|
|
}
|
|
|
|
func getKnownKeys[T any]() []string {
|
|
var keys []string
|
|
var t T
|
|
|
|
v := reflect.ValueOf(t)
|
|
typeOfT := v.Type()
|
|
|
|
re := regexp.MustCompile(`[A-Z]`)
|
|
|
|
for field := range typeOfT.NumField() {
|
|
if typeOfT.Field(field).Tag.Get("field") != "" {
|
|
keys = append(keys, typeOfT.Field(field).Tag.Get("field"))
|
|
continue
|
|
}
|
|
|
|
var key string
|
|
|
|
for i, char := range typeOfT.Field(field).Name {
|
|
if re.MatchString(string(char)) && i != 0 {
|
|
key += "-" + strings.ToLower(string(char))
|
|
continue
|
|
}
|
|
key += strings.ToLower(string(char))
|
|
}
|
|
|
|
keys = append(keys, key)
|
|
}
|
|
|
|
return keys
|
|
}
|
|
|
|
func kebabToCamel(input string) string {
|
|
res := ""
|
|
parts := strings.Split(input, "-")
|
|
|
|
for i, part := range parts {
|
|
if i == 0 {
|
|
res += part
|
|
continue
|
|
}
|
|
res += cases.Title(language.English).String(part)
|
|
}
|
|
|
|
return res
|
|
}
|