github.com/bingoohuang/gg@v0.0.0-20240325092523-45da7dee9335/pkg/flagparse/yaml.go (about) 1 package flagparse 2 3 import ( 4 "bytes" 5 "fmt" 6 "os" 7 "reflect" 8 9 "github.com/bingoohuang/gg/pkg/man" 10 "github.com/bingoohuang/gg/pkg/yaml" 11 "github.com/bingoohuang/gg/pkg/yaml/ast" 12 ) 13 14 func decodeSize(node ast.Node, typ reflect.Type) (reflect.Value, error) { 15 if s, ok := node.(*ast.StringNode); ok { 16 if v, err := man.ParseBytes(s.Value); err != nil { 17 return reflect.Value{}, err 18 } else { 19 return yaml.CastUint64(v, typ) 20 } 21 } 22 return reflect.Value{}, yaml.ErrContinue 23 } 24 25 func LoadConfFile(confFile, defaultConfFile string, app interface{}) error { 26 if confFile == "" { 27 if s, err := os.Stat(defaultConfFile); err != nil || s.IsDir() { 28 return nil // not exists 29 } 30 confFile = defaultConfFile 31 } 32 33 data, err := os.ReadFile(confFile) 34 if err != nil { 35 return fmt.Errorf("read conf file %s error: %q", confFile, err) 36 } 37 38 sizeLabel := yaml.LabelDecoder("size", decodeSize) 39 decoder := yaml.NewDecoder(bytes.NewReader(data), sizeLabel) 40 41 if err := decoder.Decode(app); err != nil { 42 return fmt.Errorf("decode conf file %s error:%q", confFile, err) 43 } 44 45 return nil 46 }