-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathxconf_update.go
67 lines (59 loc) · 2.07 KB
/
xconf_update.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
package xconf
import (
"errors"
"fmt"
"io"
"github.com/sandwich-go/xconf/xutil"
)
// UpdateWithFiles 提供files更新数据, 支持的字段类型依赖于xflag
func (x *XConf) UpdateWithFiles(files ...string) (err error) {
return x.commonUpdateAndNotify(func() error {
return x.updateDstDataWithFiles(files...)
})
}
// UpdateWithReader 提供files更新数据, 支持的字段类型依赖于xflag
func (x *XConf) UpdateWithReader(readers ...io.Reader) (err error) {
return x.commonUpdateAndNotify(func() error {
return x.updateDstDataWithReaders(readers...)
})
}
// UpdateWithFieldPathValues 根据字段FieldPath更新数据, 支持的字段类型依赖于xflag
func (x *XConf) UpdateWithFieldPathValues(kv ...string) (err error) {
args, err := xutil.KVListToFlagArgs(kv...)
if err != nil {
return fmt.Errorf("kv2FlagArgs with error:%v", err)
}
return x.UpdateWithFlagArgs(args...)
}
// UpdateWithFlagArgs 提供FlagSet合法参数更新数据,异步通知更新
func (x *XConf) UpdateWithFlagArgs(flagArgs ...string) (err error) {
return x.commonUpdateAndNotify(func() error {
return x.updateDstDataWithFlagSet(newFlagSetContinueOnError("UpdateWithFlagArgs"), flagArgs...)
})
}
// UpdateWithEnviron 提供环境变量合法配置更新数据,异步通知更新
func (x *XConf) UpdateWithEnviron(environ ...string) (err error) {
return x.commonUpdateAndNotify(func() error {
return x.updateDstDataWithEnviron(environ...)
})
}
func (x *XConf) commonUpdateAndNotify(f func() error) (err error) {
x.dynamicUpdate.Lock()
defer x.dynamicUpdate.Unlock()
if !x.hasParsed {
return errors.New("should parsed first")
}
// 更新前保护本地数据,如果更新期间出现错误,则将数据回滚
dataLatestCachedBackup := xutil.DeepCopy(x.dataLatestCached)
defer func() {
if err != nil {
x.dataLatestCached = dataLatestCachedBackup.(map[string]interface{})
}
if reason := recover(); reason != nil {
err = fmt.Errorf("%v", reason)
}
}()
err = f()
xutil.PanicErr(err)
return xutil.WrapIfErrAsFisrt(x.notifyChanged(), "got error while notifyChanged:%v")
}