package config import ( "fmt" "io" "strconv" "git.gabrielgio.me/cerrado/pkg/u" "git.sr.ht/~emersion/go-scfg" ) type ( Scan struct { Path string Public bool } Configuration struct { Scan *Scan RootReadme string } ) func Parse(r io.Reader) (*Configuration, error) { block, err := scfg.Read(r) if err != nil { return nil, err } config := defaultConfiguration() err = setScan(block, config.Scan) if err != nil { return nil, err } err = setRootReadme(block, &config.RootReadme) if err != nil { return nil, err } return config, nil } func defaultConfiguration() *Configuration { return &Configuration{ Scan: &Scan{ Public: true, Path: "", }, RootReadme: "", } } func setRootReadme(block scfg.Block, readme *string) error { scanDir := block.Get("root-readme") return setString(scanDir, readme) } func setScan(block scfg.Block, scan *Scan) error { scanDir := block.Get("scan") err := setString(scanDir, &scan.Path) if err != nil { return err } public := scanDir.Children.Get("public") return setBool(public, &scan.Public) } func setBool(dir *scfg.Directive, field *bool) error { if dir != nil { p1, _ := u.First(dir.Params) v, err := strconv.ParseBool(p1) if err != nil { return fmt.Errorf("Error parsing bool param of %s: %w", dir.Name, err) } *field = v } return nil } func setString(dir *scfg.Directive, field *string) error { if dir != nil { *field, _ = u.First(dir.Params) } return nil }