dashboard/settings/settings.go
2025-05-21 09:37:59 +08:00

60 lines
957 B
Go

package settings
import (
"fmt"
"github.com/fsnotify/fsnotify"
"github.com/spf13/viper"
)
type Settings struct {
*AppConfig
}
func New(opt ...Option) *Settings {
opts := new(options)
for _, o := range opt {
o(opts)
}
opts.repair()
res := &Settings{
AppConfig: new(AppConfig),
}
mviper := viper.New()
if opts.name != "" && opts.path != "" && opts.ctype != "" {
mviper.SetConfigName(opts.name)
mviper.AddConfigPath(opts.path)
mviper.SetConfigType(opts.ctype)
} else {
mviper.SetConfigFile(opts.name)
}
if err := mviper.ReadInConfig(); err != nil {
fmt.Println(err)
return nil
}
if err := mviper.Unmarshal(&res.AppConfig); err != nil {
fmt.Println(err)
return nil
}
mviper.WatchConfig()
mviper.OnConfigChange(func(in fsnotify.Event) {
if err := mviper.Unmarshal(res.AppConfig); err != nil {
fmt.Println(err)
}
fmt.Println("config change")
if opts.cb != nil {
opts.cb(in)
}
})
return res
}