diff options
Diffstat (limited to 'config.go')
| -rw-r--r-- | config.go | 78 |
1 files changed, 74 insertions, 4 deletions
@@ -1,9 +1,79 @@ package main +import ( + "io" + "os" + "path" + + "github.com/google/uuid" + "gopkg.in/yaml.v3" + "muhq.space/go/wrms/llog" +) + type Config struct { - Port int - Backends string - LocalMusicDir string - UploadDir string + Port int `yaml:"port"` + Backends []string `yaml:"backends"` + LocalMusicDir string `yaml:"music-dir"` + UploadDir string `yaml:"upload-dir"` + Admin uuid.UUID `yaml:"admin"` + spotify *spotifyConfig HasUpload bool } + +func defaultConfig() Config { + c := Config{Port: 8080, UploadDir: "upload"} + return c +} + +func (c Config) IsAdmin(id uuid.UUID) bool { + return c.Admin == id +} + +func findConfig() string { + confDir := os.Getenv("XDG_CONFIG_DIR") + if confDir == "" { + confDir = os.Getenv("HOME") + } + + paths := []string{"config.yml", + path.Join(confDir, "wrms", "config.yml")} + + for _, path := range paths { + fileInfo, err := os.Stat(path) + if !os.IsNotExist(err) && !fileInfo.IsDir() { + return path + } + } + + return "" +} + +func loadConfig(configPath string) Config { + f, err := os.Open(configPath) + if err != nil { + llog.Fatal("Opening config %s failed: %v", configPath, err) + } + defer f.Close() + + data, err := io.ReadAll(f) + if err != nil { + llog.Fatal("Reading config %s failed: %v", configPath, err) + } + + config := defaultConfig() + err = yaml.Unmarshal(data, &config) + if err != nil { + llog.Fatal("Failed to parse config %s: %v", configPath, err) + } + + return config +} + +func newConfig() Config { + configPath := findConfig() + if configPath != "" { + return loadConfig(configPath) + } + + return defaultConfig() +} |
