mirror of
https://shylinux.com/x/icebergs
synced 2025-04-26 01:24:05 +08:00
229 lines
7.2 KiB
Go
229 lines
7.2 KiB
Go
package ctx
|
|
|
|
import (
|
|
"encoding/json"
|
|
"path"
|
|
"strings"
|
|
|
|
ice "shylinux.com/x/icebergs"
|
|
"shylinux.com/x/icebergs/base/lex"
|
|
"shylinux.com/x/icebergs/base/mdb"
|
|
"shylinux.com/x/icebergs/base/nfs"
|
|
kit "shylinux.com/x/toolkits"
|
|
"shylinux.com/x/toolkits/miss"
|
|
)
|
|
|
|
func _config_format_list(m *ice.Message, v ice.Any) string {
|
|
list := []string{"{", lex.NL}
|
|
kit.For(v, func(k string, v ice.Any) {
|
|
if k == mdb.HASH {
|
|
list = append(list, lex.TB, kit.Format("%q", k), nfs.DF, "{", lex.NL)
|
|
kit.For(v, func(k string, v ice.Any) {
|
|
list = append(list, lex.TB, lex.TB, kit.Format("%q", k), nfs.DF, kit.Format(v), mdb.FS, lex.NL)
|
|
})
|
|
list = list[:len(list)-2]
|
|
list = append(list, lex.TB, lex.NL, lex.TB, "}", mdb.FS, lex.NL)
|
|
} else {
|
|
list = append(list, lex.TB, kit.Format("%q", k), nfs.DF, kit.Format(v), mdb.FS, lex.NL)
|
|
}
|
|
})
|
|
list = list[:len(list)-2]
|
|
list = append(list, lex.NL, "}")
|
|
return strings.Join(list, "")
|
|
}
|
|
func _config_only(v ice.Any, arg ...string) bool {
|
|
switch v := v.(type) {
|
|
case nil:
|
|
return true
|
|
case ice.Map:
|
|
if len(v) > len(arg) {
|
|
return false
|
|
}
|
|
for k, v := range v {
|
|
if v, ok := v.(ice.Map); ok && len(v) == 0 {
|
|
continue
|
|
} else if kit.IndexOf(arg, k) == -1 {
|
|
return false
|
|
}
|
|
}
|
|
return true
|
|
}
|
|
return false
|
|
}
|
|
func _config_save(m *ice.Message, name string, arg ...string) {
|
|
data, msg := ice.Map{}, m.Spawn(m.Source())
|
|
for _, k := range arg {
|
|
if v := mdb.Confv(msg, k); _config_only(v, mdb.META) && _config_only(kit.Value(v, mdb.META), mdb.IMPORTANT, mdb.SHORT, mdb.FIELD, mdb.FIELDS, mdb.ACTION, mdb.SORT, mdb.TOOLS) {
|
|
continue
|
|
} else {
|
|
data[k] = v
|
|
}
|
|
}
|
|
if len(data) == 0 {
|
|
return
|
|
}
|
|
if f, _, e := miss.CreateFile(path.Join(ice.VAR_CONF, name)); m.Assert(e) {
|
|
defer f.Close()
|
|
if s, e := json.MarshalIndent(data, "", " "); !m.Warn(e) {
|
|
if _, e := f.Write(s); !m.Warn(e) {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
func _config_load(m *ice.Message, name string, arg ...string) {
|
|
if f, e := miss.OpenFile(path.Join(ice.VAR_CONF, name)); e == nil {
|
|
defer f.Close()
|
|
data, msg := ice.Map{}, m.Spawn(m.Source())
|
|
json.NewDecoder(f).Decode(&data)
|
|
for k, v := range data {
|
|
msg.Search(k, func(p *ice.Context, s *ice.Context, key string, conf *ice.Config) {
|
|
kit.If(s.Configs[key] == nil, func() { 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 {
|
|
kit.If(strings.HasPrefix(arg[1], mdb.AT), func() { arg[1] = msg.Cmdx(nfs.CAT, arg[1][1:]) })
|
|
if !kit.IsIn(strings.Split(arg[0], nfs.PT)[0], mdb.META, mdb.HASH, mdb.LIST) {
|
|
arg[0] = kit.Keys(mdb.META, arg[0])
|
|
}
|
|
mdb.Confv(msg, key, arg[0], kit.Parse(nil, "", arg[1:]...))
|
|
}
|
|
if len(arg) > 0 {
|
|
m.Echo(FormatPretty(mdb.Confv(msg, key, arg[0]), 0, 1))
|
|
} else {
|
|
m.Echo(FormatPretty(mdb.Confv(msg, key), 0, 1))
|
|
m.StatusTime(mdb.COUNT, kit.Length(mdb.Confv(msg, key, mdb.HASH)))
|
|
}
|
|
}
|
|
func _config_list(m *ice.Message) {
|
|
for k, v := range m.Source().Configs {
|
|
if IsOrderCmd(k) {
|
|
continue
|
|
}
|
|
m.Push(mdb.KEY, k).Push(mdb.NAME, v.Name).Push(mdb.VALUE, kit.Format(v.Value))
|
|
}
|
|
m.Sort(mdb.KEY)
|
|
}
|
|
|
|
const (
|
|
SAVE = "save"
|
|
LOAD = "load"
|
|
)
|
|
const CONFIG = "config"
|
|
|
|
func init() {
|
|
Index.MergeCommands(ice.Commands{
|
|
CONFIG: {Name: "config key auto", Help: "配置", Actions: ice.Actions{
|
|
SAVE: {Hand: func(m *ice.Message, arg ...string) { _config_save(m, arg[0], arg[1:]...) }},
|
|
LOAD: {Hand: func(m *ice.Message, arg ...string) { _config_load(m, arg[0], arg[1:]...) }},
|
|
mdb.EXPORT: {Hand: func(m *ice.Message, arg ...string) { m.Cmdy(arg[0], mdb.EXPORT) }},
|
|
mdb.IMPORT: {Hand: func(m *ice.Message, arg ...string) { m.Cmdy(arg[0], mdb.IMPORT) }},
|
|
nfs.TRASH: {Hand: func(m *ice.Message, arg ...string) {
|
|
nfs.Trash(m, path.Join(ice.VAR_DATA, arg[0]))
|
|
nfs.Trash(m, m.Cmdx(arg[0], mdb.EXPORT))
|
|
mdb.Config(m, arg[0], nil, nil)
|
|
}},
|
|
mdb.LIST: {Hand: func(m *ice.Message, arg ...string) {
|
|
list := []ice.Any{}
|
|
kit.For(arg[2:], func(v string) { list = append(list, v) })
|
|
mdb.Confv(m, arg[0], arg[1], list)
|
|
}},
|
|
}, Hand: func(m *ice.Message, arg ...string) {
|
|
if len(arg) == 0 {
|
|
_config_list(m)
|
|
} else {
|
|
_config_make(m, arg[0], arg[1:]...)
|
|
m.Action(mdb.EXPORT, mdb.IMPORT, nfs.TRASH)
|
|
}
|
|
}},
|
|
})
|
|
}
|
|
func init() { ice.Info.Save = Save; ice.Info.Load = Load }
|
|
func Save(m *ice.Message, arg ...string) *ice.Message {
|
|
kit.If(len(arg) == 0, func() { arg = kit.SortedKey(m.Target().Configs) })
|
|
kit.For(arg, func(i int, k string) { arg[i] = strings.Replace(m.Prefix(k), nfs.PS, "", 1) })
|
|
return m.Cmd(CONFIG, SAVE, m.Prefix(nfs.JSON), arg)
|
|
}
|
|
func Load(m *ice.Message, arg ...string) *ice.Message {
|
|
kit.If(len(arg) == 0, func() { arg = kit.SortedKey(m.Target().Configs) })
|
|
kit.For(arg, func(i int, k string) { arg[i] = strings.Replace(m.Prefix(k), nfs.PS, "", 1) })
|
|
return m.Cmd(CONFIG, LOAD, m.Prefix(nfs.JSON), arg)
|
|
}
|
|
func ConfAction(arg ...ice.Any) ice.Actions { return ice.Actions{ice.CTX_INIT: mdb.AutoConfig(arg...)} }
|
|
func ConfigSimple(m *ice.Message, key ...string) (res []string) {
|
|
kit.For(kit.Split(kit.Join(key)), func(k string) { res = append(res, k, mdb.Config(m, k)) })
|
|
return
|
|
}
|
|
func ConfigFromOption(m *ice.Message, arg ...string) {
|
|
if len(arg) == 0 {
|
|
kit.For(m.Target().Commands[m.CommandKey()].Actions[m.ActionKey()].List, func(value ice.Any) {
|
|
arg = append(arg, kit.Format(kit.Value(value, mdb.NAME)))
|
|
})
|
|
}
|
|
kit.For(arg, func(k string) { mdb.Config(m, k, kit.Select(mdb.Config(m, k), m.Option(k))) })
|
|
}
|
|
func OptionFromConfig(m *ice.Message, arg ...string) string {
|
|
kit.For(arg, func(k string) { m.Option(k, mdb.Config(m, k)) })
|
|
return m.Option(arg[0])
|
|
}
|
|
func FormatPretty(v ice.Any, i, n int) string {
|
|
return kit.Formats(v)
|
|
switch v := v.(type) {
|
|
case map[string]ice.Any:
|
|
if n == 0 {
|
|
list := []string{"{"}
|
|
kit.For(v, func(k string, v ice.Any) {
|
|
list = append(list, kit.Format("%q", k), nfs.DF, FormatPretty(v, 0, 0), mdb.FS)
|
|
})
|
|
list = list[:len(list)-1]
|
|
list = append(list, "}")
|
|
return strings.Join(list, "")
|
|
}
|
|
list := []string{"{", lex.NL}
|
|
kit.For(v, func(k string, v ice.Any) {
|
|
list = append(list, strings.Repeat(lex.TB, i+1), kit.Format("%q", k), nfs.DF)
|
|
if i < n && !kit.IsIn(k, mdb.META) && !strings.HasPrefix(k, "_") {
|
|
list = append(list, FormatPretty(v, i+1, n))
|
|
} else {
|
|
list = append(list, FormatPretty(v, 0, 0))
|
|
}
|
|
list = append(list, mdb.FS, lex.NL)
|
|
})
|
|
list = append(list[:len(list)-2], lex.NL)
|
|
list = append(list, strings.Repeat(lex.TB, i), "}")
|
|
return strings.Join(list, "")
|
|
case []ice.Any:
|
|
if n == 0 {
|
|
list := []string{"["}
|
|
kit.For(v, func(k string, v ice.Any) {
|
|
list = append(list, FormatPretty(v, 0, 0), mdb.FS)
|
|
})
|
|
list = list[:len(list)-1]
|
|
list = append(list, "]")
|
|
return strings.Join(list, "")
|
|
}
|
|
list := []string{"[", lex.NL}
|
|
kit.For(v, func(v ice.Any) {
|
|
list = append(list, strings.Repeat(lex.TB, i+1))
|
|
if i < n {
|
|
list = append(list, FormatPretty(v, i+1, n))
|
|
} else {
|
|
list = append(list, FormatPretty(v, 0, 0))
|
|
}
|
|
list = append(list, mdb.FS, lex.NL)
|
|
})
|
|
list = append(list[:len(list)-2], lex.NL)
|
|
list = append(list, strings.Repeat(lex.TB, i), "]")
|
|
return strings.Join(list, "")
|
|
case string:
|
|
return kit.Format(v)
|
|
return kit.Format("%q", v)
|
|
default:
|
|
return kit.Format(v)
|
|
}
|
|
}
|