package configuration import ( "os" "strings" "github.com/pkg/errors" "gopkg.in/yaml.v3" ) type Configuration struct { ListenOn string `yaml:"listen_on"` Icecast struct { URL string `yaml:"url"` Playlist string `yaml:"playlist_path"` } `yaml:"icecast"` Liquidsoap struct { ExecPath string `yaml:"executable_path"` ScriptPath string `yaml:"script_path"` } `yaml:"liquidsoap"` ListLastNSongs int `yaml:"list_last_n_songs"` Log struct { Error string `yaml:"error"` } `yaml:"log"` } // Load reads a YAML file that stores configuration of a service. func Load(path string) (*Configuration, error) { configFile, err := os.Open(path) if err != nil { return nil, errors.Wrap(err, "failed to open configuration file") } defer configFile.Close() config := &Configuration{} if err := yaml.NewDecoder(configFile).Decode(config); err != nil { return nil, errors.Wrap(err, "failed to parse configuration file") } return config, nil } // SplitNetworkAddress splits ListenOn option into network type (e.g. tcp, unix, // udp) and address:port or /path/to/service.socket to listen on. func (c *Configuration) SplitNetworkAddress() (string, string) { s := strings.Split(c.ListenOn, " ") return s[0], s[1] }