osc-mqtt-bridge/config.go

88 lines
2.3 KiB
Go

package main
import (
"log"
"os"
"os/user"
"path/filepath"
"gopkg.in/yaml.v2"
)
// Configuration Structure
type Config struct {
// Relays: Different relays available.
Relays []*Relay `yaml:"relays"`
}
// ReadConfig Read the configuration file
func (a *App) ReadConfig() {
usr, err := user.Current()
if err != nil {
log.Fatal(err)
}
// Configuration paths.
localConfig, _ := filepath.Abs("./config.yaml")
homeDirConfig := usr.HomeDir + "/.config/osc-mqtt-bridge/config.yaml"
etcConfig := "/etc/osc-mqtt-bridge/config.yaml"
// Determine which configuration to use.
var configFile string
if _, err := os.Stat(app.flags.ConfigPath); err == nil && app.flags.ConfigPath != "" {
configFile = app.flags.ConfigPath
} else if _, err := os.Stat(localConfig); err == nil {
configFile = localConfig
} else if _, err := os.Stat(homeDirConfig); err == nil {
configFile = homeDirConfig
} else if _, err := os.Stat(etcConfig); err == nil {
configFile = etcConfig
} else {
log.Fatal("Unable to find a configuration file.")
}
app.config = new(Config)
yamlFile, err := os.ReadFile(configFile)
if err != nil {
log.Fatalf("Error reading YAML file: %s\n", err)
}
err = yaml.Unmarshal(yamlFile, &app.config)
if err != nil {
log.Fatalf("Error parsing YAML file: %s\n", err)
}
if len(app.config.Relays) == 0 {
log.Fatal("No relays defined in the configuration file.")
}
for _, relay := range app.config.Relays {
if relay.OscBindAddr != "" && relay.OscBindPort == 0 {
relay.OscBindPort = relay.OscPort
}
}
for i, relay := range app.config.Relays {
if relay.MqttHost == "" || relay.MqttPort == 0 {
log.Fatalf("Relay %d: MQTT host and port are required configurations.", i)
}
if relay.MqttTopic == "" {
log.Fatalf("Relay %d: MQTT topic is a required configuration.", i)
}
if relay.OscBindAddr == "" && relay.OscHost == "" {
log.Fatalf("Relay %d: You must define either a bind address or an OSC host in the configuration.", i)
}
for b, relay2 := range app.config.Relays {
if b != i {
if relay.MqttTopic == relay2.MqttTopic {
log.Fatalf("Relay %d: MQTT topic cannot exist on 2 different relays.", i)
}
if relay.OscBindPort == relay2.OscBindPort {
log.Fatalf("Relay %d: Cannot use the same OSC bind port on 2 different relays.", i)
}
}
}
}
}