aboutsummaryrefslogtreecommitdiff
path: root/app/cmd/root.go
diff options
context:
space:
mode:
Diffstat (limited to 'app/cmd/root.go')
-rw-r--r--app/cmd/root.go52
1 files changed, 52 insertions, 0 deletions
diff --git a/app/cmd/root.go b/app/cmd/root.go
new file mode 100644
index 0000000..33c3642
--- /dev/null
+++ b/app/cmd/root.go
@@ -0,0 +1,52 @@
+package cmd
+
+import (
+ "fmt"
+ "log/slog"
+ "os"
+
+ "github.com/spf13/cobra"
+ "github.com/spf13/viper"
+)
+
+var (
+ cfgFile string
+ dbFile string
+ debug bool
+ rootCmd = &cobra.Command{Use: "gorum"}
+)
+
+func init() {
+ cobra.OnInitialize(initLogger)
+ cobra.OnInitialize(initConfig)
+ rootCmd.PersistentFlags().StringVar(&cfgFile, "config", "gorum.yaml", "config file (default is 'gorum.yaml')")
+ rootCmd.PersistentFlags().StringVar(&dbFile, "db", "gorum.db", "database file (default is 'gorum.db')")
+ rootCmd.PersistentFlags().BoolVar(&debug, "debug", false, "verbose debug output")
+ viper.BindPFlag("db", serverCmd.Flags().Lookup("db"))
+}
+
+func initLogger() {
+ level := slog.LevelInfo
+ if debug {
+ level = slog.LevelDebug
+ }
+ logger := slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{Level: level})
+ slog.SetDefault(slog.New(logger))
+}
+
+func initConfig() {
+ viper.SetConfigFile(cfgFile)
+
+ if err := viper.ReadInConfig(); err != nil {
+ slog.Warn("can't read config", slog.Any("error", err))
+ }
+}
+
+func Execute() {
+ rootCmd.AddCommand(serverCmd)
+
+ if err := rootCmd.Execute(); err != nil {
+ fmt.Println(err)
+ os.Exit(1)
+ }
+}