From 5ee0fb4aa53e02a4b6c2ffb3d5bfa3a6153c9a06 Mon Sep 17 00:00:00 2001 From: Florian Fischer Date: Sun, 21 May 2023 20:05:01 +0200 Subject: implement YAML config and admin connections --- config.go | 78 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 74 insertions(+), 4 deletions(-) (limited to 'config.go') diff --git a/config.go b/config.go index a74069d..049145a 100644 --- a/config.go +++ b/config.go @@ -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() +} -- cgit v1.2.3