From 4af7f630b9fd99c472e4ca4911ad3f898f6eb218 Mon Sep 17 00:00:00 2001 From: David Christofas Date: Tue, 1 Mar 2022 16:16:58 +0100 Subject: [PATCH] First version of the envvar docs generator Signed-off-by: Christian Richter --- docs/helpers/configenvextractor.go | 45 ++++++++++++++++++ docs/helpers/extractor.go.tmpl | 73 ++++++++++++++++++++++++++++++ 2 files changed, 118 insertions(+) create mode 100644 docs/helpers/configenvextractor.go create mode 100644 docs/helpers/extractor.go.tmpl diff --git a/docs/helpers/configenvextractor.go b/docs/helpers/configenvextractor.go new file mode 100644 index 0000000000..c9b9a401f8 --- /dev/null +++ b/docs/helpers/configenvextractor.go @@ -0,0 +1,45 @@ +package main + +import ( + "fmt" + "io/ioutil" + "log" + "os" + "os/exec" + "path/filepath" + "strings" + "text/template" +) + +func main() { + paths, err := filepath.Glob("../../*/pkg/config/defaultconfig.go") + if err != nil { + log.Fatal(err) + } + replacer := strings.NewReplacer( + "../../", "github.com/owncloud/ocis/", + "/defaultconfig.go", "", + ) + for i := range paths { + paths[i] = replacer.Replace(paths[i]) + } + content, err := ioutil.ReadFile("extractor.go.tmpl") + if err != nil { + log.Fatal(err) + } + tpl := template.Must(template.New("").Parse(string(content))) + os.Mkdir("output", 0700) + runner, err := os.Create("output/runner.go") + if err != nil { + log.Fatal(err) + } + tpl.Execute(runner, paths) + os.Chdir("output") + out, err := exec.Command("go", "run", "runner.go").Output() + if err != nil { + log.Fatal(err) + } + os.Chdir("../") + os.RemoveAll("output") + fmt.Println(string(out)) +} diff --git a/docs/helpers/extractor.go.tmpl b/docs/helpers/extractor.go.tmpl new file mode 100644 index 0000000000..1f9ea96981 --- /dev/null +++ b/docs/helpers/extractor.go.tmpl @@ -0,0 +1,73 @@ +package main + +import ( + "fmt" + "io/ioutil" + "log" + "os" + "reflect" + "strings" + "text/template" + + {{- range $key, $value := .}} + pkg{{$key}} "{{$value}}" + {{- end}}) + +type ConfigField struct { + Name string + DefaultValue string + Type string + Description string +} + +func main() { +content, err := ioutil.ReadFile("../../../docs/templates/CONFIGURATION.tmpl") +if err != nil { + log.Fatal(err) +} +replacer := strings.NewReplacer( + "github.com/owncloud/ocis/", "", + "/pkg/config", "", + ) +var fields []ConfigField +var targetFile *os.File +tpl := template.Must(template.New("").Parse(string(content))) +{{ range $key, $value := .}} + fields = GetAnnotatedVariables(*pkg{{ $key }}.DefaultConfig()) + if len(fields) > 0 { + targetFolder := "../../../docs/extensions/" + replacer.Replace("{{ $value }}") + os.MkdirAll(targetFolder, 0700) + targetFile, err = os.Create(targetFolder + "/configvars.md") + if err != nil { + log.Fatal(err) + } + tpl.Execute(targetFile, fields) + targetFile.Close() + } +{{ end }} +} + +func GetAnnotatedVariables(s interface{}) []ConfigField { + t := reflect.TypeOf(s) + v := reflect.ValueOf(s) + + var fields []ConfigField + for i := 0; i < t.NumField(); i++ { + field := t.Field(i) + value := v.Field(i) + + switch value.Kind() { + default: + desc := field.Tag.Get("desc") + env, ok := field.Tag.Lookup("env") + if !ok { + continue + } + v := fmt.Sprintf("%v", value.Interface()) + fields = append(fields, ConfigField{Name: env, DefaultValue: v, Description: desc, Type: value.Type().Name()}) + case reflect.Struct: + fields = append(fields, GetAnnotatedVariables(value.Interface())...) + } + } + return fields +}