syncthing/proto/scripts/dump_tags.go

70 lines
1.5 KiB
Go

// Copyright (C) 2020 The Syncthing Authors.
//
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this file,
// You can obtain one at https://mozilla.org/MPL/2.0/.
//go:build ignore
// +build ignore
package main
import (
"encoding/csv"
"fmt"
"os"
"path/filepath"
"reflect"
"strings"
"github.com/syncthing/syncthing/lib/config"
)
func main() {
new, err := os.Create("tags.csv")
if err != nil {
panic(err)
}
fmt.Println(filepath.Abs(new.Name()))
w := csv.NewWriter(new)
w.Write([]string{
"path", "json", "xml", "default", "restart",
})
walk(w, "", &config.Configuration{})
w.Flush()
new.Close()
}
func walk(w *csv.Writer, prefix string, data interface{}) {
s := reflect.ValueOf(data).Elem()
t := s.Type()
for i := 0; i < s.NumField(); i++ {
f := s.Field(i)
ft := t.Field(i)
for f.Kind() == reflect.Ptr {
f = f.Elem()
}
pfx := prefix + "." + s.Type().Field(i).Name
if f.Kind() == reflect.Slice {
slc := reflect.MakeSlice(f.Type(), 1, 1)
f = slc.Index(0)
pfx = prefix + "." + s.Type().Field(i).Name + "[]"
}
if f.Kind() == reflect.Struct && strings.HasPrefix(f.Type().PkgPath(), "github.com/syncthing/syncthing") {
walk(w, pfx, f.Addr().Interface())
} else {
jsonTag := ft.Tag.Get("json")
xmlTag := ft.Tag.Get("xml")
defaultTag := ft.Tag.Get("default")
restartTag := ft.Tag.Get("restart")
w.Write([]string{
strings.ToLower(pfx), jsonTag, xmlTag, defaultTag, restartTag,
})
}
}
}