diff options
Diffstat (limited to 'pkg/config/config.go')
-rw-r--r-- | pkg/config/config.go | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/pkg/config/config.go b/pkg/config/config.go new file mode 100644 index 0000000..ba1614f --- /dev/null +++ b/pkg/config/config.go @@ -0,0 +1,84 @@ +package config + +import ( + "fmt" + "io" + "strconv" + + "git.sr.ht/~emersion/go-scfg" +) + +type ( + Scan struct { + Path string + Public bool + } + + Configuration struct { + Scan *Scan + } +) + +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 + } + + return config, nil +} + +func defaultConfiguration() *Configuration { + return &Configuration{ + Scan: &Scan{ + Public: true, + Path: "", + }, + } +} + +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 := 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 = first(dir.Params) + } + return nil +} + +func first[T any](v []T) T { + if len(v) == 0 { + var zero T + return zero + } + return v[0] +} |