aboutsummaryrefslogtreecommitdiff
path: root/pkg/config/config.go
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/config/config.go')
-rw-r--r--pkg/config/config.go84
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]
+}