aboutsummaryrefslogtreecommitdiff
path: root/pkg/config/config.go
diff options
context:
space:
mode:
authorGabriel A. Giovanini <mail@gabrielgio.me>2024-05-04 23:16:38 +0200
committerGabriel A. Giovanini <mail@gabrielgio.me>2024-05-04 23:17:02 +0200
commit8a2461aa05895cc7828bc9619b50fa5dee5ed1f4 (patch)
tree86c6848d9c9a7d7b2d272fa43af66350d2cd1d0e /pkg/config/config.go
parent3fb9c66ffa0bf87cbd7cc1b5f4129f3447e94c13 (diff)
downloadcerrado-8a2461aa05895cc7828bc9619b50fa5dee5ed1f4.tar.gz
cerrado-8a2461aa05895cc7828bc9619b50fa5dee5ed1f4.tar.bz2
cerrado-8a2461aa05895cc7828bc9619b50fa5dee5ed1f4.zip
feat: Add config parsing
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]
+}