package gocommon import ( "encoding/json" "os" "time" "repositories.action2quare.com/ayo/gocommon/flagx" ) var configfileflag = flagx.String("config", "", "") func configFilePath() string { configfilepath := "config.json" if configfileflag != nil && len(*configfileflag) > 0 { configfilepath = *configfileflag } // if !strings.HasPrefix(configfilepath, "/") { // exe, _ := os.Executable() // configfilepath = path.Join(path.Dir(exe), configfilepath) // } return configfilepath } func ConfigModTime() time.Time { fi, err := os.Stat(configFilePath()) if err == nil { return fi.ModTime() } return time.Time{} } func MonitorConfig[T any](onChanged func(newconf *T)) error { fi, err := os.Stat(configFilePath()) if err != nil { return err } go func(modTime time.Time, filepath string) { for { if fi, err := os.Stat(filepath); err == nil { if modTime != fi.ModTime() { var next T if err := LoadConfig(&next); err == nil { fi, _ := os.Stat(filepath) modTime = fi.ModTime() onChanged(&next) } } } time.Sleep(time.Second) } }(fi.ModTime(), configFilePath()) return nil } func LoadConfig[T any](outptr *T) error { configfilepath := configFilePath() content, err := os.ReadFile(configfilepath) if os.IsNotExist(err) { return os.WriteFile(configfilepath, []byte("{}"), 0666) } return json.Unmarshal([]byte(os.ExpandEnv(string(content))), outptr) } type StorageAddr struct { Mongo string Redis map[string]string } type RegionStorageConfig struct { RegionStorage map[string]StorageAddr `json:"region_storage"` }