1
0
mirror of https://shylinux.com/x/icebergs synced 2025-04-26 01:24:05 +08:00
icebergs/base/ctx/config.go
2022-08-03 08:14:22 +08:00

155 lines
3.7 KiB
Go

package ctx
import (
"encoding/json"
"path"
"strings"
ice "shylinux.com/x/icebergs"
"shylinux.com/x/icebergs/base/mdb"
"shylinux.com/x/icebergs/base/nfs"
kit "shylinux.com/x/toolkits"
"shylinux.com/x/toolkits/miss"
)
func _config_save(m *ice.Message, name string, arg ...string) {
name = path.Join(ice.VAR_CONF, name)
if f, p, e := miss.CreateFile(name); m.Assert(e) {
defer f.Close()
msg := m.Spawn(m.Source())
data := ice.Map{}
for _, k := range arg {
if v := msg.Confv(k); v != "" {
data[k] = v
}
}
// 保存配置
if s, e := json.MarshalIndent(data, "", " "); m.Assert(e) {
if _, e := f.Write(s); m.Assert(e) {
}
}
m.Echo(p)
}
}
func _config_load(m *ice.Message, name string, arg ...string) {
name = path.Join(ice.VAR_CONF, name)
if f, e := miss.OpenFile(name); e == nil {
defer f.Close()
msg := m.Spawn(m.Source())
data := ice.Map{}
json.NewDecoder(f).Decode(&data)
// 加载配置
for k, v := range data {
msg.Search(k, func(p *ice.Context, s *ice.Context, key string) {
if s.Configs[key] == nil {
s.Configs[key] = &ice.Config{}
}
s.Configs[key].Value = v
})
}
}
}
func _config_make(m *ice.Message, key string, arg ...string) {
msg := m.Spawn(m.Source())
if len(arg) > 1 {
if strings.HasPrefix(arg[1], "@") {
arg[1] = msg.Cmdx(nfs.CAT, arg[1][1:])
}
// 修改配置
msg.Confv(key, arg[0], kit.Parse(nil, "", arg[1:]...))
}
if len(arg) > 0 {
m.Echo(kit.Formats(msg.Confv(key, arg[0])))
} else {
m.Echo(kit.Formats(msg.Confv(key)))
}
}
func _config_list(m *ice.Message) {
for k, v := range m.Source().Configs {
if k[0] == '/' || k[0] == '_' {
continue // 内部配置
}
m.Push(mdb.KEY, k)
m.Push(mdb.NAME, v.Name)
m.Push(mdb.VALUE, kit.Format(v.Value))
}
m.Sort(mdb.KEY)
}
const (
SAVE = "save"
LOAD = "load"
RICH = "rich"
GROW = "grow"
)
const CONFIG = "config"
func init() {
Index.MergeCommands(ice.Commands{
CONFIG: {Name: "config key auto reset", Help: "配置", Actions: ice.Actions{
SAVE: {Name: "save", Help: "保存", Hand: func(m *ice.Message, arg ...string) {
_config_save(m, arg[0], arg[1:]...)
}},
LOAD: {Name: "load", Help: "加载", Hand: func(m *ice.Message, arg ...string) {
_config_load(m, arg[0], arg[1:]...)
}},
RICH: {Name: "rich", Help: "富有", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(mdb.INSERT, arg[0], arg[1], mdb.HASH, arg[2:])
}},
GROW: {Name: "grow", Help: "成长", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(mdb.INSERT, arg[0], arg[1], mdb.LIST, arg[2:])
}},
"list": {Name: "list", Help: "列表", Hand: func(m *ice.Message, arg ...string) {
list := []ice.Any{}
for _, v := range arg[2:] {
list = append(list, v)
}
m.Confv(arg[0], arg[1], kit.List(list...))
}},
"reset": {Name: "reset key sub", Help: "重置", Hand: func(m *ice.Message, arg ...string) {
m.Conf(m.Option("key"), m.Option("sub"), "")
m.Go(func() { m.Cmd(ice.EXIT, 1) })
}},
}, Hand: func(m *ice.Message, arg ...string) {
if len(arg) == 0 {
_config_list(m)
return
}
_config_make(m, arg[0], arg[1:]...)
DisplayStoryJSON(m)
}},
})
}
func init() {
ice.Info.Save = Save
ice.Info.Load = Load
}
func Save(m *ice.Message, arg ...string) *ice.Message {
if len(arg) == 0 {
for k := range m.Target().Configs {
arg = append(arg, k)
}
}
for i, k := range arg {
arg[i] = m.Prefix(k)
}
return m.Cmd(CONFIG, ice.SAVE, m.Prefix(nfs.JSON), arg)
}
func Load(m *ice.Message, arg ...string) *ice.Message {
if len(arg) == 0 {
for k := range m.Target().Configs {
arg = append(arg, k)
}
}
for i, k := range arg {
arg[i] = m.Prefix(k)
}
return m.Cmd(CONFIG, ice.LOAD, m.Prefix(nfs.JSON), arg)
}