aboutsummaryrefslogtreecommitdiff
path: root/forged/internal/config/config.go
diff options
context:
space:
mode:
Diffstat (limited to 'forged/internal/config/config.go')
-rw-r--r--forged/internal/config/config.go61
1 files changed, 61 insertions, 0 deletions
diff --git a/forged/internal/config/config.go b/forged/internal/config/config.go
new file mode 100644
index 0000000..da28e05
--- /dev/null
+++ b/forged/internal/config/config.go
@@ -0,0 +1,61 @@
+package config
+
+import (
+ "bufio"
+ "fmt"
+ "log/slog"
+ "os"
+
+ "go.lindenii.runxiyu.org/forge/forged/internal/common/scfg"
+ "go.lindenii.runxiyu.org/forge/forged/internal/database"
+ "go.lindenii.runxiyu.org/forge/forged/internal/incoming/hooks"
+ "go.lindenii.runxiyu.org/forge/forged/internal/incoming/lmtp"
+ "go.lindenii.runxiyu.org/forge/forged/internal/incoming/ssh"
+ "go.lindenii.runxiyu.org/forge/forged/internal/incoming/web"
+ "go.lindenii.runxiyu.org/forge/forged/internal/ipc/irc"
+)
+
+type Config struct {
+ DB database.Config `scfg:"db"`
+ Web web.Config `scfg:"web"`
+ Hooks hooks.Config `scfg:"hooks"`
+ LMTP lmtp.Config `scfg:"lmtp"`
+ SSH ssh.Config `scfg:"ssh"`
+ IRC irc.Config `scfg:"irc"`
+ Git struct {
+ RepoDir string `scfg:"repo_dir"`
+ Socket string `scfg:"socket"`
+ } `scfg:"git"`
+ General struct {
+ Title string `scfg:"title"`
+ } `scfg:"general"`
+ Pprof struct {
+ Net string `scfg:"net"`
+ Addr string `scfg:"addr"`
+ } `scfg:"pprof"`
+}
+
+func Open(path string) (config Config, err error) {
+ var configFile *os.File
+
+ configFile, err = os.Open(path) //#nosec G304
+ if err != nil {
+ err = fmt.Errorf("open config file: %w", err)
+ return config, err
+ }
+ defer func() {
+ _ = configFile.Close()
+ }()
+
+ decoder := scfg.NewDecoder(bufio.NewReader(configFile))
+ err = decoder.Decode(&config)
+ if err != nil {
+ err = fmt.Errorf("decode config file: %w", err)
+ return config, err
+ }
+ for _, u := range decoder.UnknownDirectives() {
+ slog.Warn("unknown configuration directive", "directive", u)
+ }
+
+ return config, err
+}