Files
budget-backend/cmd/root.go
kratisto 1a27ed5274
Some checks failed
golangci-lint / lint (push) Failing after 21s
Test / test (push) Failing after 2m17s
chore: migrate to gitea
2026-01-27 01:40:31 +01:00

121 lines
3.4 KiB
Go
Executable File

package cmd
import (
"fmt"
"os"
"gitea.frenchtouch.duckdns.org/kratisto/budget-backend/ginserver"
"gitea.frenchtouch.duckdns.org/kratisto/budget-backend/handler"
"gitea.frenchtouch.duckdns.org/kratisto/budget-backend/internal/utils"
"github.com/sirupsen/logrus"
"github.com/spf13/cobra"
"github.com/spf13/viper"
)
var (
config = &handler.Config{}
cfgFile string
)
const (
parameterConfigurationFile = "config"
parameterLogLevel = "loglevel"
parameterMock = "mock"
parameterLogFormat = "logformat"
parameterDBConnectionURI = "dbconnectionuri"
parameterPort = "port"
)
var (
defaultLogLevel = logrus.WarnLevel.String()
defaultLogFormat = utils.LogFormatText
defaultDBConnectionURI = ""
defaultPort = 8080
)
var rootCmd = &cobra.Command{
Use: "budget",
Short: "budget",
Run: func(cmd *cobra.Command, args []string) {
utils.InitLogger(config.LogLevel, config.LogFormat)
logrus.
WithField(parameterConfigurationFile, cfgFile).
WithField(parameterMock, config.Mock).
WithField(parameterLogLevel, config.LogLevel).
WithField(parameterLogFormat, config.LogFormat).
WithField(parameterPort, config.Port).
WithField(parameterDBConnectionURI, config.DBConnectionURI).
Warn("Configuration")
router := ginserver.NewRouter(config)
err := router.Run(fmt.Sprintf(":%d", config.Port))
if err != nil {
return
}
},
}
func Execute() {
if err := rootCmd.Execute(); err != nil {
fmt.Println(err)
os.Exit(1)
}
}
func init() {
cobra.OnInitialize(initConfig)
rootCmd.PersistentFlags().StringVar(&cfgFile, parameterConfigurationFile, "", "Config file. All flags given in command line will override the values from this file.")
rootCmd.Flags().String(parameterLogLevel, defaultLogLevel, "Use this flag to set the logging level")
err := viper.BindPFlag(parameterLogLevel, rootCmd.Flags().Lookup(parameterLogLevel))
if err != nil {
return
}
rootCmd.Flags().String(parameterLogFormat, defaultLogFormat, "Use this flag to set the logging format")
err = viper.BindPFlag(parameterLogFormat, rootCmd.Flags().Lookup(parameterLogFormat))
if err != nil {
return
}
rootCmd.Flags().String(parameterDBConnectionURI, defaultDBConnectionURI, "Use this flag to set the db connection URI")
err = viper.BindPFlag(parameterDBConnectionURI, rootCmd.Flags().Lookup(parameterDBConnectionURI))
if err != nil {
return
}
rootCmd.Flags().Int(parameterPort, defaultPort, "Use this flag to set the listening port of the api")
err = viper.BindPFlag(parameterPort, rootCmd.Flags().Lookup(parameterPort))
if err != nil {
return
}
rootCmd.Flags().Bool(parameterMock, false, "Use this flag to enable the mock mode")
err = viper.BindPFlag(parameterMock, rootCmd.Flags().Lookup(parameterMock))
if err != nil {
return
}
}
// initConfig reads in config file and ENV variables if set.
func initConfig() {
if cfgFile != "" {
// Use config file from the flag.
viper.SetConfigFile(cfgFile)
}
viper.AutomaticEnv() // read in environment variables that match
// If a config file is found, read it in.
if err := viper.ReadInConfig(); err == nil {
fmt.Println("Using config file:", viper.ConfigFileUsed())
}
config.LogLevel = viper.GetString(parameterLogLevel)
config.LogFormat = viper.GetString(parameterLogFormat)
config.Mock = viper.GetBool(parameterMock)
config.DBConnectionURI = viper.GetString(parameterDBConnectionURI)
config.Port = viper.GetInt(parameterPort)
}