63 lines
1.4 KiB
Go
63 lines
1.4 KiB
Go
// Print the available environment variables
|
|
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"reflect"
|
|
"strings"
|
|
|
|
"github.com/bakito/adguardhome-sync/pkg/types"
|
|
)
|
|
|
|
func main() {
|
|
_, _ = fmt.Println("| Name | Type | Description |")
|
|
_, _ = fmt.Println("| :--- | ---- |:----------- |")
|
|
printEnvTags(reflect.TypeOf(types.Config{}), "")
|
|
}
|
|
|
|
// printEnvTags recursively prints all fields with `env` tags.
|
|
func printEnvTags(t reflect.Type, prefix string) {
|
|
if t.Kind() == reflect.Ptr {
|
|
t = t.Elem()
|
|
}
|
|
if t.Kind() != reflect.Struct {
|
|
return
|
|
}
|
|
|
|
for _, field := range reflect.VisibleFields(t) {
|
|
if field.PkgPath != "" { // unexported field
|
|
continue
|
|
}
|
|
|
|
envTag := field.Tag.Get("env")
|
|
if envTag == "" {
|
|
switch field.Name {
|
|
case "Origin":
|
|
envTag = "ORIGIN"
|
|
case "Replica":
|
|
envTag = "REPLICA#"
|
|
}
|
|
}
|
|
combinedTag := envTag
|
|
if prefix != "" && envTag != "" {
|
|
combinedTag = prefix + "_" + envTag
|
|
} else if prefix != "" {
|
|
combinedTag = prefix
|
|
}
|
|
|
|
ft := field.Type
|
|
if ft.Kind() == reflect.Ptr {
|
|
ft = ft.Elem()
|
|
}
|
|
|
|
if ft.Kind() == reflect.Struct && ft.Name() != "Time" { // skip time.Time
|
|
printEnvTags(ft, strings.TrimSuffix(combinedTag, "_"))
|
|
} else if envTag != "" {
|
|
envVar := strings.Trim(combinedTag, "_") + " (" + ft.Kind().String() + ")"
|
|
docs := field.Tag.Get("documentation")
|
|
|
|
_, _ = fmt.Printf("| %s | %s | %s |\n", envVar, ft.Kind().String(), docs)
|
|
}
|
|
}
|
|
}
|