summaryrefslogtreecommitdiff
path: root/cmd/authelia-gen/helpers.go
diff options
context:
space:
mode:
Diffstat (limited to 'cmd/authelia-gen/helpers.go')
-rw-r--r--cmd/authelia-gen/helpers.go51
1 files changed, 44 insertions, 7 deletions
diff --git a/cmd/authelia-gen/helpers.go b/cmd/authelia-gen/helpers.go
index 0a9894da4..814a35c7e 100644
--- a/cmd/authelia-gen/helpers.go
+++ b/cmd/authelia-gen/helpers.go
@@ -12,6 +12,7 @@ import (
"path/filepath"
"reflect"
"regexp"
+ "sort"
"strings"
"time"
@@ -116,8 +117,20 @@ func readVersion(cmd *cobra.Command) (version *model.SemanticVersion, err error)
return model.NewSemanticVersion(packageJSON.Version)
}
+func readTags(prefix string, t reflect.Type, envSkip, deprecatedSkip, doSort bool) (tags []string) {
+ tags = iReadTags(prefix, t, envSkip, deprecatedSkip, false)
+
+ tags = removeDuplicate(tags)
+
+ if doSort {
+ sort.Strings(tags)
+ }
+
+ return tags
+}
+
//nolint:gocyclo
-func readTags(prefix string, t reflect.Type, envSkip, deprecatedSkip bool) (tags []string) {
+func iReadTags(prefix string, t reflect.Type, envSkip, deprecatedSkip, parentSlice bool) (tags []string) {
tags = make([]string, 0)
if envSkip && (t.Kind() == reflect.Slice || t.Kind() == reflect.Map) {
@@ -126,7 +139,7 @@ func readTags(prefix string, t reflect.Type, envSkip, deprecatedSkip bool) (tags
if t.Kind() != reflect.Struct {
if t.Kind() == reflect.Slice {
- tags = append(tags, readTags(getKeyNameFromTagAndPrefix(prefix, "", true, false), t.Elem(), envSkip, deprecatedSkip)...)
+ tags = append(tags, iReadTags(getKeyNameFromTagAndPrefix(prefix, "", true, false), t.Elem(), envSkip, deprecatedSkip, true)...)
}
return
@@ -150,7 +163,11 @@ func readTags(prefix string, t reflect.Type, envSkip, deprecatedSkip bool) (tags
switch kind := field.Type.Kind(); kind {
case reflect.Struct:
if !containsType(field.Type, decodedTypes) {
- tags = append(tags, readTags(getKeyNameFromTagAndPrefix(prefix, tag, false, false), field.Type, envSkip, deprecatedSkip)...)
+ if parentSlice {
+ tags = append(tags, getKeyNameFromTagAndPrefix(prefix, tag, false, false))
+ }
+
+ tags = append(tags, iReadTags(getKeyNameFromTagAndPrefix(prefix, tag, false, false), field.Type, envSkip, deprecatedSkip, false)...)
continue
}
@@ -169,7 +186,7 @@ func readTags(prefix string, t reflect.Type, envSkip, deprecatedSkip bool) (tags
case reflect.Struct:
if !containsType(field.Type.Elem(), decodedTypes) {
tags = append(tags, getKeyNameFromTagAndPrefix(prefix, tag, false, false))
- tags = append(tags, readTags(getKeyNameFromTagAndPrefix(prefix, tag, kind == reflect.Slice, kind == reflect.Map), field.Type.Elem(), envSkip, deprecatedSkip)...)
+ tags = append(tags, iReadTags(getKeyNameFromTagAndPrefix(prefix, tag, kind == reflect.Slice, kind == reflect.Map), field.Type.Elem(), envSkip, deprecatedSkip, kind == reflect.Slice)...)
continue
}
@@ -178,13 +195,17 @@ func readTags(prefix string, t reflect.Type, envSkip, deprecatedSkip bool) (tags
tags = append(tags, getKeyNameFromTagAndPrefix(prefix, tag, true, true))
}
- tags = append(tags, readTags(getKeyNameFromTagAndPrefix(prefix, tag, kind == reflect.Slice, kind == reflect.Map), field.Type.Elem(), envSkip, deprecatedSkip)...)
+ tags = append(tags, iReadTags(getKeyNameFromTagAndPrefix(prefix, tag, kind == reflect.Slice, kind == reflect.Map), field.Type.Elem(), envSkip, deprecatedSkip, true)...)
}
case reflect.Ptr:
switch field.Type.Elem().Kind() {
case reflect.Struct:
if !containsType(field.Type.Elem(), decodedTypes) {
- tags = append(tags, readTags(getKeyNameFromTagAndPrefix(prefix, tag, false, false), field.Type.Elem(), envSkip, deprecatedSkip)...)
+ if parentSlice {
+ tags = append(tags, getKeyNameFromTagAndPrefix(prefix, tag, false, false))
+ }
+
+ tags = append(tags, iReadTags(getKeyNameFromTagAndPrefix(prefix, tag, false, false), field.Type.Elem(), envSkip, deprecatedSkip, false)...)
continue
}
@@ -197,7 +218,7 @@ func readTags(prefix string, t reflect.Type, envSkip, deprecatedSkip bool) (tags
if k == reflect.Struct {
if !containsType(field.Type.Elem(), decodedTypes) {
- tags = append(tags, readTags(getKeyNameFromTagAndPrefix(prefix, tag, true, false), field.Type.Elem(), envSkip, deprecatedSkip)...)
+ tags = append(tags, iReadTags(getKeyNameFromTagAndPrefix(prefix, tag, true, false), field.Type.Elem(), envSkip, deprecatedSkip, field.Type.Elem().Kind() == reflect.Slice)...)
continue
}
@@ -309,3 +330,19 @@ func readCompose(path string) (compose *Compose, err error) {
return compose, nil
}
+
+func removeDuplicate[T comparable](sliceList []T) []T {
+ var list []T
+
+ allKeys := make(map[T]bool)
+
+ for _, item := range sliceList {
+ if _, value := allKeys[item]; !value {
+ allKeys[item] = true
+
+ list = append(list, item)
+ }
+ }
+
+ return list
+}