-
Notifications
You must be signed in to change notification settings - Fork 1
/
config.go
118 lines (97 loc) · 2.55 KB
/
config.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
package config
import (
"time"
"unsafe"
"github.com/wjshen/gophrame/core/logger"
jsoniter "github.com/json-iterator/go"
"github.com/modern-go/reflect2"
)
// Module Config Settings
type ConfigSetting struct {
Name string
Description string
Setting interface{}
}
var configs = make(map[string]ConfigSetting)
func RegisterConfig(name string, setting interface{}, desc string) {
configs[name] = ConfigSetting{
Name: name,
Description: desc,
Setting: setting,
}
}
var configChangeCallbacks = make([]func(), 0)
func RegisterConfigChangeCallback(f func()) {
configChangeCallbacks = append(configChangeCallbacks, f)
}
type JsonExtension struct {
jsoniter.DummyExtension
}
type DurationDecoder struct{}
func (*DurationDecoder) Decode(ptr unsafe.Pointer, iter *jsoniter.Iterator) {
switch iter.WhatIsNext() {
case jsoniter.StringValue:
if d, err := time.ParseDuration(iter.ReadString()); err == nil {
*(*time.Duration)(ptr) = time.Duration(d)
}
case jsoniter.NilValue:
*((*time.Duration)(ptr)) = time.Duration(0)
default:
*((*time.Duration)(ptr)) = time.Duration(iter.ReadInt64())
}
}
func (*JsonExtension) CreateDecoder(typ reflect2.Type) jsoniter.ValDecoder {
if typ.AssignableTo(reflect2.TypeOf(time.Duration(0))) {
return &DurationDecoder{}
}
return nil
}
var json = jsoniter.ConfigCompatibleWithStandardLibrary
func init() {
json.RegisterExtension(&JsonExtension{})
RegisterConfigChangeCallback(func() {
loadConfig()
})
}
func InitConfig() error {
return loadConfig()
}
func UnmarshalFromNode(node any, out interface{}) error {
if data, err := json.Marshal(node); err == nil {
// Use json to
return json.Unmarshal(data, out)
} else {
return err
}
}
func loadConfig() error {
var config = make(map[string]interface{})
// First load into map[]
var err error
if err = InitYamlConfig(&config); err == nil {
// Logger
if text, _ := json.MarshalToString(config); text != "" {
logger.Debug("Load application configuration: ", text)
}
// Second to json
for key, value := range configs {
if key == "ROOT" {
// "ROOT" node
err = UnmarshalFromNode(config, value.Setting)
} else if node, ok := config[key]; ok {
// Setting node
logger.Debug("Load module configuration: ", key)
err = UnmarshalFromNode(node, value.Setting)
}
if err != nil {
logger.Error("Load configuration error: ", key, err.Error())
break
} else {
if text, _ := json.MarshalToString(value.Setting); text != "" {
logger.Debug("Load configuration: ", key, text)
}
}
}
}
return err
}