Files
gocommon/reflect_config.go
2023-06-20 17:02:09 +09:00

73 lines
1.3 KiB
Go

package gocommon
import (
"encoding/json"
"os"
"time"
)
func configFilePath() string {
configfilepath := "config.json"
if configfileflag != nil && len(*configfileflag) > 0 {
configfilepath = *configfileflag
}
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(content, outptr)
}
type StorageAddr struct {
Mongo string
Redis struct {
URL string
Offset map[string]int
}
}
type RegionStorageConfig struct {
RegionStorage map[string]StorageAddr `json:"region_storage"`
}