diff options
| author | Florian Fischer <florian.fischer@muhq.space> | 2023-05-21 20:05:01 +0200 |
|---|---|---|
| committer | Florian Fischer <florian.fischer@muhq.space> | 2023-05-21 20:05:01 +0200 |
| commit | 5ee0fb4aa53e02a4b6c2ffb3d5bfa3a6153c9a06 (patch) | |
| tree | 5268e39568e6146521e4be9e0c1b70d3afca538c /config.go | |
| parent | ead811a4ebd0074cc4d42da53daacbb358229fac (diff) | |
| download | WRMS-5ee0fb4aa53e02a4b6c2ffb3d5bfa3a6153c9a06.tar.gz WRMS-5ee0fb4aa53e02a4b6c2ffb3d5bfa3a6153c9a06.zip | |
implement YAML config and admin connections
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() +} |
