godyn/config/config.go
2023-10-16 15:52:17 +02:00

85 lines
2 KiB
Go

package config
import (
"os"
"path"
"strings"
"time"
"velvettear/godyn/log"
"velvettear/godyn/tools"
"github.com/fsnotify/fsnotify"
"github.com/spf13/viper"
)
// exported function(s)
func Initialize() {
timestamp := time.Now().UnixMilli()
configSpecified := false
for index, arg := range os.Args {
arg = strings.ToLower(arg)
if arg == "-h" || arg == "--"+help {
tools.PrintHelp()
}
if arg == "-y" || arg == "--"+yaml {
viper.SetConfigFile(os.Args[index+1])
configSpecified = true
continue
}
if arg == "-c" || arg == "--client" {
clientMode = true
continue
}
if arg == "-s" || arg == "--server" {
serverMode = true
continue
}
}
setDefaults()
if !configSpecified {
var mode string
if serverMode {
mode = "server"
} else {
mode = "client"
}
viper.SetConfigName(mode + "-config")
viper.SetConfigType("yaml")
viper.AddConfigPath("$HOME/.config/godyn/")
viper.AddConfigPath("$HOME/.config/")
workingDirectory, error := os.Getwd()
for error == nil && path.Base(workingDirectory) != "godyn" {
workingDirectory = path.Dir(workingDirectory)
if workingDirectory == "/" {
workingDirectory = "."
break
}
}
viper.AddConfigPath(workingDirectory)
}
error := viper.ReadInConfig()
if configSpecified && error != nil {
log.FatalTimed("encountered an error parsing specified config file '"+viper.ConfigFileUsed()+"'", timestamp, error.Error())
}
log.SetDebug(Debug())
log.DebugTimed("parsed config file '"+viper.ConfigFileUsed()+"'", timestamp)
viper.OnConfigChange(func(in fsnotify.Event) {
log.Info("config file changed")
})
viper.WatchConfig()
}
// unexported function(s)
func setDefaults() {
// set server defaults
viper.SetDefault(serverListen, "localhost")
viper.SetDefault(serverPort, 3333)
// set client defaults
viper.SetDefault(ipProviderUrl, "https://icanhazip.com")
viper.SetDefault(interval, 0)
// set notification settings
viper.SetDefault(notificatonEnabled, false)
// set other defaults
viper.SetDefault(debug, false)
viper.SetDefault(help, false)
}