worklog/internal/config/config.go
2023-01-27 17:11:22 +01:00

73 lines
1.9 KiB
Go

package config
import (
"os"
"path"
"velvettear/worklog/internal/log"
"velvettear/worklog/internal/tools"
"github.com/spf13/viper"
)
// exported function(s)
func Initialize() {
timestamp := tools.LogTimestamp()
configSpecified := false
for index, arg := range os.Args {
if arg == "-h" || arg == "--"+help {
tools.PrintHelp()
}
if arg == "-c" || arg == "--"+config {
viper.SetConfigFile(os.Args[index+1])
configSpecified = true
}
}
setDefaults()
if !configSpecified {
viper.SetConfigName("config")
viper.SetConfigType("yaml")
viper.AddConfigPath("$HOME/.config/worklog/")
viper.AddConfigPath("$HOME/.config/")
workingDirectory, error := os.Getwd()
for error == nil && path.Base(workingDirectory) != "worklog" {
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())
}
headers := viper.GetStringSlice(reportHeaders)
headersLength := len(headers)
defaultLength := len(tools.ReportHeaders)
for headersLength < defaultLength {
tmp := tools.ReportHeaders[headersLength]
headers = append(headers, tmp)
headersLength = len(headers)
}
viper.Set(reportHeaders, headers)
if Debug() {
log.SetLogLevel(0)
}
log.DebugTimed("parsed config file '"+viper.ConfigFileUsed()+"'", timestamp)
}
func setDefaults() {
home := path.Join(os.TempDir(), "worklog")
// set database defaults
viper.SetDefault(database, path.Join(home, "worklog.sqlite"))
// set server defaults
viper.SetDefault(serverListen, "localhost")
viper.SetDefault(serverPort, 3333)
// set report defaults
viper.SetDefault(reportHeaders, tools.ReportHeaders)
// set other defaults
viper.SetDefault(debug, false)
viper.SetDefault(help, false)
}