viper-app/cmd/init_conf.go
2023-02-03 16:18:31 +08:00

86 lines
1.8 KiB
Go

package cmd
import (
"encoding/json"
"fmt"
"github.com/fsnotify/fsnotify"
"github.com/spf13/viper"
"go.uber.org/zap"
"os"
"packet-ui/internal/model"
"packet-ui/internal/server"
"packet-ui/pkg"
"packet-ui/pkg/db"
"strings"
)
func InitConfig() (err error) {
if cfgFile != "" {
// Use config file from the flag.
viper.SetConfigFile(cfgFile)
} else {
var workdir string
// Find workdir.
workdir, err = os.Getwd()
if err != nil {
return err
}
// set default config file $PWD/conf/application.yml
viper.AddConfigPath(workdir + "/conf")
viper.SetConfigType("yaml")
viper.SetConfigName("application")
}
configDefault()
configWatch()
viper.AutomaticEnv() // read in environment variables that match
// If a config file is found, read it in.
if err = viper.ReadInConfig(); err != nil {
return
}
if err = viper.Unmarshal(model.GetConfig()); err != nil {
return
}
cfgData, _ := json.Marshal(model.GetConfig())
println("config", pkg.B2S(cfgData))
svr := model.GetConfig().Svr
if strings.HasPrefix(svr.Address, ":") {
svr.Address = "0.0.0.0" + svr.Address
}
//defer func() {
// if e := viper.WriteConfig(); e != nil {
// zap.L().Warn("save config err!", zap.Error(e))
// }
//}()
return err
}
func configDefault() {
// db
viper.SetDefault("db.type", db.TypeSQLITE)
viper.SetDefault("db.dsn", "./packet-ui.db")
// file
viper.SetDefault("file.data", "./data/root")
// viper.
}
func configWatch() {
viper.OnConfigChange(func(in fsnotify.Event) {
eventString := fmt.Sprintf("%s -> `%s`", in.Op, in.Name)
zap.L().Info("config file change", zap.String("event", eventString))
if err := viper.Unmarshal(model.GetConfig()); err != nil {
zap.L().Info("save config err!", zap.Error(err))
}
server.GetSvr().Dispatch(model.GetConfig())
})
viper.WatchConfig()
}