12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455 |
- package yamlutil
- import (
- "flag"
- "fmt"
- "strings"
- "gopkg.in/yaml.v1"
- )
- // SetFlagsFromYaml goes through all registered flags in the given flagset,
- // and if they are not already set it attempts to set their values from
- // the YAML config. It will use the key REPLACE(UPPERCASE(flagname), '-', '_')
- func SetFlagsFromYaml(fs *flag.FlagSet, rawYaml []byte) (err error) {
- conf := make(map[string]string)
- if err = yaml.Unmarshal(rawYaml, conf); err != nil {
- return
- }
- alreadySet := map[string]struct{}{}
- fs.Visit(func(f *flag.Flag) {
- alreadySet[f.Name] = struct{}{}
- })
- errs := make([]error, 0)
- fs.VisitAll(func(f *flag.Flag) {
- if f.Name == "" {
- return
- }
- if _, ok := alreadySet[f.Name]; ok {
- return
- }
- tag := strings.Replace(strings.ToUpper(f.Name), "-", "_", -1)
- val, ok := conf[tag]
- if !ok {
- return
- }
- if serr := fs.Set(f.Name, val); serr != nil {
- errs = append(errs, fmt.Errorf("invalid value %q for %s: %v", val, tag, serr))
- }
- })
- if len(errs) != 0 {
- err = ErrorSlice(errs)
- }
- return
- }
- type ErrorSlice []error
- func (e ErrorSlice) Error() string {
- s := ""
- for _, err := range e {
- s += ", " + err.Error()
- }
- return "Errors: " + s
- }
|