From af6cc2fcf3dd5e3ff2879dbc27d6d217d953793f Mon Sep 17 00:00:00 2001 From: shylinux Date: Fri, 24 Mar 2023 08:04:27 +0800 Subject: [PATCH] opt ice --- base/ctx/context.go | 4 +- base/mdb/lock.go | 2 +- base/nfs/cat.go | 2 +- base/ssh/script.go | 7 +-- base/web/option.go | 2 +- conf.go | 2 - data.go | 38 ++++++-------- exec.go | 25 +-------- init.go | 6 +-- misc.go | 22 ++++++++ misc/git/status.go | 4 +- misc/git/total.go | 24 ++++++++- option.go | 63 ++++------------------- render.go | 120 +++++++++----------------------------------- type.go | 84 ++++--------------------------- 15 files changed, 114 insertions(+), 291 deletions(-) diff --git a/base/ctx/context.go b/base/ctx/context.go index 4a0ae30c..dc42ee5b 100644 --- a/base/ctx/context.go +++ b/base/ctx/context.go @@ -14,8 +14,6 @@ func _context_list(m *ice.Message, sub *ice.Context, name string) { return } m.Push(mdb.NAME, s.Cap(ice.CTX_FOLLOW)) - m.Push(mdb.STATUS, s.Cap(ice.CTX_STATUS)) - m.Push(mdb.STREAM, s.Cap(ice.CTX_STREAM)) m.Push(mdb.HELP, s.Help) }) } @@ -28,7 +26,7 @@ func init() { if len(arg) == 0 { arg = append(arg, m.Source().Cap(ice.CTX_FOLLOW)) } - m.Search(arg[0]+ice.PT, func(p *ice.Context, s *ice.Context, key string) { + m.Search(arg[0]+ice.PT, func(p *ice.Context, s *ice.Context) { msg := m.Spawn(s) defer m.Copy(msg) switch kit.Select(CONTEXT, arg, 1) { diff --git a/base/mdb/lock.go b/base/mdb/lock.go index 664ed0f0..425b26c4 100644 --- a/base/mdb/lock.go +++ b/base/mdb/lock.go @@ -10,7 +10,7 @@ import ( type configMessage interface { Option(key string, arg ...Any) string - PrefixKey(...Any) string + PrefixKey() string Confv(...Any) Any } diff --git a/base/nfs/cat.go b/base/nfs/cat.go index ee156ff1..a89f9147 100644 --- a/base/nfs/cat.go +++ b/base/nfs/cat.go @@ -164,8 +164,8 @@ func OptionLoad(m *ice.Message, file string) *ice.Message { } type templateMessage interface { - PrefixKey(arg ...ice.Any) string Cmdx(arg ...ice.Any) string + PrefixKey() string } func Template(m templateMessage, file string, arg ...ice.Any) string { diff --git a/base/ssh/script.go b/base/ssh/script.go index f0f09060..3070d211 100644 --- a/base/ssh/script.go +++ b/base/ssh/script.go @@ -33,7 +33,7 @@ type Frame struct { } func (f *Frame) prompt(m *ice.Message, list ...string) *Frame { - if f.source != STDIO || m.Target().Cap(ice.CTX_STATUS) == ice.CTX_CLOSE { + if f.source != STDIO { return f } kit.If(len(list) == 0, func() { list = append(list, f.ps1...) }) @@ -58,9 +58,6 @@ func (f *Frame) printf(m *ice.Message, str string, arg ...ice.Any) *Frame { if f.source != STDIO { return f } - if m.Target().Cap(ice.CTX_STATUS) == ice.CTX_CLOSE { - return f - } fmt.Fprint(f.stdout, kit.Format(str, arg...)) return f } @@ -155,7 +152,7 @@ func (f *Frame) Start(m *ice.Message, arg ...string) { m.Optionv(FRAME, f) switch f.source = kit.Select(STDIO, arg, 0); f.source { case STDIO: - if m.Cap(ice.CTX_STREAM, f.source); f.target == nil { + if f.target == nil { f.target = m.Target() } r, w, _ := os.Pipe() diff --git a/base/web/option.go b/base/web/option.go index 41fa44c0..cd7aff1d 100644 --- a/base/web/option.go +++ b/base/web/option.go @@ -112,7 +112,7 @@ func PushPodCmd(m *ice.Message, cmd string, arg ...string) { type Message interface { Option(key string, arg ...ice.Any) string - PrefixKey(arg ...ice.Any) string + PrefixKey() string } func OptionAgentIs(m Message, arg ...string) bool { diff --git a/conf.go b/conf.go index 93d474b1..ea8651b7 100644 --- a/conf.go +++ b/conf.go @@ -259,8 +259,6 @@ const ( // CTX CTX_DAEMON = "ctx_daemon" CTX_FOLLOW = "follow" - CTX_STATUS = "status" - CTX_STREAM = "stream" CTX_BEGIN = "begin" CTX_START = "start" diff --git a/data.go b/data.go index f8d2c530..a3f0b6ae 100644 --- a/data.go +++ b/data.go @@ -9,25 +9,24 @@ import ( kit "shylinux.com/x/toolkits" ) -func (m *Message) ActionKey() string { - return strings.TrimPrefix(strings.TrimSuffix(m._sub, PS), PS) -} -func (m *Message) CommandKey() string { - return strings.TrimPrefix(strings.TrimSuffix(m._key, PS), PS) -} -func (m *Message) PrefixRawKey(arg ...Any) string { - return kit.Keys(m.Prefix(m._key), kit.Keys(arg...)) -} -func (m *Message) PrefixKey(arg ...Any) string { - return kit.Keys(m.Prefix(m.CommandKey()), kit.Keys(arg...)) -} -func (m *Message) Prefix(arg ...string) string { - return m.Target().Prefix(arg...) -} +func (m *Message) ActionKey() string { return strings.TrimPrefix(strings.TrimSuffix(m._sub, PS), PS) } +func (m *Message) CommandKey() string { return strings.TrimPrefix(strings.TrimSuffix(m._key, PS), PS) } +func (m *Message) PrefixKey() string { return m.Prefix(m.CommandKey()) } func (m *Message) PrefixPath(arg ...Any) string { return strings.TrimPrefix(path.Join(strings.ReplaceAll(m.PrefixRawKey(arg...), PT, PS)), "web") + PS } +func (m *Message) PrefixRawKey(arg ...Any) string { return m.Prefix(m._key, kit.Keys(arg...)) } +func (m *Message) Prefix(arg ...string) string { return m.Target().Prefix(arg...) } +func SaveImportant(m *Message, arg ...string) { + if Info.Important != true { + return + } + for i, v := range arg { + kit.If(v == "" || strings.Contains(v, SP), func() { arg[i] = "\"" + v + "\"" }) + } + m.Cmd("nfs.push", VAR_DATA_IMPORTANT, kit.Join(arg, SP), NL) +} func loadImportant(m *Message) { if f, e := os.Open(VAR_DATA_IMPORTANT); e == nil { defer f.Close() @@ -40,13 +39,4 @@ func loadImportant(m *Message) { } Info.Important = true } -func SaveImportant(m *Message, arg ...string) { - if Info.Important != true { - return - } - for i, v := range arg { - kit.If(v == "" || strings.Contains(v, SP), func() { arg[i] = "\"" + v + "\"" }) - } - m.Cmd("nfs.push", VAR_DATA_IMPORTANT, kit.Join(arg, SP), NL) -} func removeImportant(m *Message) { os.Remove(VAR_DATA_IMPORTANT) } diff --git a/exec.go b/exec.go index 2025e6d4..9550c448 100644 --- a/exec.go +++ b/exec.go @@ -3,7 +3,6 @@ package ice import ( "errors" "io" - "sync" "time" kit "shylinux.com/x/toolkits" @@ -27,9 +26,7 @@ func (m *Message) TryCatch(msg *Message, catch bool, cb ...func(msg *Message)) * } } }() - if len(cb) > 0 { - cb[0](msg) - } + kit.If(len(cb) > 0, func() { cb[0](msg) }) return m } func (m *Message) Assert(expr Any) bool { @@ -56,26 +53,6 @@ func (m *Message) Sleep(d Any, arg ...Any) *Message { func (m *Message) Sleep300ms(arg ...Any) *Message { return m.Sleep("300ms", arg...) } func (m *Message) Sleep30ms(arg ...Any) *Message { return m.Sleep("30ms", arg...) } func (m *Message) Sleep3s(arg ...Any) *Message { return m.Sleep("3s", arg...) } -func (m *Message) TableGo(cb Any) *Message { - wg, lock := sync.WaitGroup{}, &task.Lock{} - defer wg.Wait() - m.Tables(func(value Maps) { - wg.Add(1) - task.Put(logs.FileLine(cb), func(*task.Task) error { - defer wg.Done() - switch cb := cb.(type) { - case func(Maps, *task.Lock): - cb(value, lock) - case func(Maps): - cb(value) - default: - m.ErrorNotImplement(cb) - } - return nil - }) - }) - return m -} func (m *Message) Go(cb Any, arg ...Any) *Message { kit.If(len(arg) == 0, func() { arg = append(arg, logs.FileLine(cb)) }) task.Put(arg[0], func(task *task.Task) error { diff --git a/init.go b/init.go index 2156611e..d0a2158c 100644 --- a/init.go +++ b/init.go @@ -50,13 +50,9 @@ const ( var Index = &Context{Name: ICE, Help: "冰山模块", Commands: Commands{ CTX_INIT: {Hand: func(m *Message, arg ...string) { m.Travel(func(p *Context, c *Context) { - kit.If(p != nil, func() { m.Go(func() { c._command(m.Spawn(c), c.Commands[CTX_INIT], CTX_INIT, arg...) }) }) + kit.If(p != nil, func() { c._command(m.Spawn(c), c.Commands[CTX_INIT], CTX_INIT, arg...) }) }) loadImportant(m) - loadImportant(m) - loadImportant(m) - loadImportant(m) - loadImportant(m) }}, INIT: {Hand: func(m *Message, arg ...string) { m.Cmd(CTX_INIT) diff --git a/misc.go b/misc.go index 9d44468d..459e76ca 100644 --- a/misc.go +++ b/misc.go @@ -484,3 +484,25 @@ func (m *Message) CmdAppend(arg ...Any) string { field := kit.Slice(args, -1)[0] return m._command(kit.Slice(args, 0, -1), OptionFields(field)).Append(field) } +func (m *Message) IsCliUA() bool { + if m.Option(MSG_USERUA) == "" || !strings.HasPrefix(m.Option(MSG_USERUA), "Mozilla") { + return true + } + return false +} +func (m *Message) IsMobileUA() bool { + return strings.Contains(m.Option(MSG_USERUA), "Mobile") +} +func (m *Message) MergePodCmd(pod, cmd string, arg ...Any) string { + ls := []string{"chat"} + kit.If(kit.Keys(m.Option(MSG_USERPOD), pod), func(p string) { ls = append(ls, POD, p) }) + if cmd == "" { + if _, ok := Info.Index[m.CommandKey()]; ok { + cmd = m.CommandKey() + } else { + cmd = m.PrefixKey() + } + } + ls = append(ls, CMD, cmd) + return kit.MergeURL2(strings.Split(kit.Select(Info.Domain, m.Option(MSG_USERWEB)), QS)[0], PS+kit.Join(ls, PS), arg...) +} diff --git a/misc/git/status.go b/misc/git/status.go index 49853777..8b450d3c 100644 --- a/misc/git/status.go +++ b/misc/git/status.go @@ -123,7 +123,7 @@ func _status_list(m *ice.Message) (files, adds, dels int, last time.Time) { last = ci.Author.When } } - tags := kit.Format(mdb.Cache(m, m.PrefixKey(value[REPOS], TAGS), func() ice.Any { return _git_cmds(m, "describe", "--tags") })) + tags := _git_cmds(m, "describe", "--tags") kit.SplitKV(ice.SP, ice.NL, _git_cmds(m, STATUS, "-sb"), func(text string, ls []string) { switch kit.Ext(ls[1]) { case "swp", "swo", ice.BIN, ice.VAR: @@ -238,7 +238,6 @@ func init() { }}, OPT: {Help: "优化"}, PRO: {Help: "升级"}, COMMIT: {Name: "commit action=opt,add,pro comment=some", Help: "提交", Hand: func(m *ice.Message, arg ...string) { _repos_cmd(m, m.Option(REPOS), COMMIT, "-am", m.Option(ctx.ACTION)+ice.SP+m.Option(COMMENT)) - mdb.Cache(m, m.PrefixKey(m.Option(REPOS), TAGS), nil) m.ProcessBack() }}, PIE: {Help: "饼图", Hand: func(m *ice.Message, arg ...string) { m.Cmdy(TOTAL, PIE) }}, @@ -248,7 +247,6 @@ func init() { } _repos_cmd(m, m.Option(REPOS), TAG, m.Option(VERSION)) _repos_cmd(m, m.Option(REPOS), PUSH, "--tags") - mdb.Cache(m, m.PrefixKey(m.Option(REPOS), TAGS), nil) ctx.ProcessRefresh(m) }}, TAGS: {Help: "标签", Hand: func(m *ice.Message, arg ...string) { _status_tags(m) }}, diff --git a/misc/git/total.go b/misc/git/total.go index d2299387..a1af2b22 100644 --- a/misc/git/total.go +++ b/misc/git/total.go @@ -3,6 +3,7 @@ package git import ( "path" "strings" + "sync" "time" ice "shylinux.com/x/icebergs" @@ -11,6 +12,7 @@ import ( "shylinux.com/x/icebergs/base/mdb" "shylinux.com/x/icebergs/base/nfs" kit "shylinux.com/x/toolkits" + "shylinux.com/x/toolkits/logs" "shylinux.com/x/toolkits/task" ) @@ -44,7 +46,7 @@ func init() { return } from, days, adds, dels, rest, commit := "", 0, 0, 0, 0, 0 - ReposList(m).TableGo(func(value ice.Maps, lock *task.Lock) { + TableGo(ReposList(m), func(value ice.Maps, lock *task.Lock) { if mdb.Config(m, kit.Keys("skip", value[REPOS])) == ice.TRUE { return } @@ -123,3 +125,23 @@ func init() { }}, }) } +func TableGo(m *ice.Message, cb ice.Any) *ice.Message { + wg, lock := sync.WaitGroup{}, &task.Lock{} + defer wg.Wait() + m.Tables(func(value ice.Maps) { + wg.Add(1) + task.Put(logs.FileLine(cb), func(*task.Task) error { + defer wg.Done() + switch cb := cb.(type) { + case func(ice.Maps, *task.Lock): + cb(value, lock) + case func(ice.Maps): + cb(value) + default: + m.ErrorNotImplement(cb) + } + return nil + }) + }) + return m +} diff --git a/option.go b/option.go index 5f603d29..996c3cf2 100644 --- a/option.go +++ b/option.go @@ -13,77 +13,37 @@ type Option struct { func OptionFields(arg ...string) Option { return Option{MSG_FIELDS, kit.Join(arg)} } func (m *Message) OptionFields(arg ...string) string { - if len(arg) > 0 { - m.Option(MSG_FIELDS, kit.Join(arg)) - } + kit.If(len(arg) > 0, func() { m.Option(MSG_FIELDS, kit.Join(arg)) }) return kit.Join(kit.Simple(m.Optionv(MSG_FIELDS))) } func (m *Message) OptionDefault(arg ...string) string { - for i := 0; i < len(arg); i += 2 { - if m.Option(arg[i]) == "" && arg[i+1] != "" { - m.Option(arg[i], arg[i+1]) - } - } + kit.For(arg, func(k, v string) { kit.If(m.Option(k) == "" && v != "", func() { m.Option(k, v) }) }) return m.Option(arg[0]) } func (m *Message) OptionSimple(key ...string) (res []string) { - if len(key) == 0 { - for _, k := range kit.Split(kit.Select("type,name,text", m.Conf(m.PrefixKey(), kit.Keym(FIELD)))) { - switch k { - case TIME, HASH: - continue - } - if k == "" || m.Option(k) == "" { - continue - } - res = append(res, k, m.Option(k)) - } - return - } - for _, k := range kit.Split(kit.Join(key)) { - if k == "" || m.Option(k) == "" { - continue - } - res = append(res, k, m.Option(k)) - } + kit.If(len(key) == 0, func() { key = kit.Filters(kit.Split(kit.Select("type,name,text", m.Config(FIELD))), TIME, HASH) }) + kit.For(kit.Filters(kit.Split(kit.Join(key)), ""), func(k string) { kit.If(m.Option(k), func(v string) { res = append(res, k, v) }) }) return } func (m *Message) OptionSplit(key ...string) (res []string) { - for _, k := range kit.Split(kit.Join(key)) { - res = append(res, m.Option(k)) - } + kit.For(kit.Split(kit.Join(key)), func(k string) { res = append(res, m.Option(k)) }) return res } func (m *Message) OptionCB(key string, cb ...Any) Any { - if len(cb) > 0 { - return m.Optionv(kit.Keycb(kit.Select(m.CommandKey(), key)), cb...) - } + kit.If(len(cb) > 0, func() { m.Optionv(kit.Keycb(kit.Select(m.CommandKey(), key)), cb...) }) return m.Optionv(kit.Keycb(kit.Select(m.CommandKey(), key))) } func (m *Message) FieldsIsDetail() bool { - if len(m.meta[MSG_APPEND]) == 2 && m.meta[MSG_APPEND][0] == KEY && m.meta[MSG_APPEND][1] == VALUE { - return true - } - if m.OptionFields() == FIELDS_DETAIL { - return true - } - return false + return len(m.meta[MSG_APPEND]) == 2 && m.meta[MSG_APPEND][0] == KEY && m.meta[MSG_APPEND][1] == VALUE || m.OptionFields() == FIELDS_DETAIL } func (m *Message) Fields(length int, fields ...string) string { - return m.Option(MSG_FIELDS, kit.Select(kit.Select(FIELDS_DETAIL, fields, length), m.Option(MSG_FIELDS))) + return m.OptionDefault(MSG_FIELDS, kit.Select(FIELDS_DETAIL, fields, length)) } func (m *Message) Action(arg ...Any) *Message { - for i, v := range arg { - switch v.(type) { - case string: - default: - arg[i] = kit.Format(v) - } - } - m.Option(MSG_ACTION, kit.Format(arg)) - return m + kit.For(arg, func(i int, v Any) { arg[i] = kit.Format(v) }) + return m.Options(MSG_ACTION, kit.Format(arg)) } func (m *Message) Status(arg ...Any) *Message { list, args := kit.List(), kit.Simple(arg) @@ -94,8 +54,7 @@ func (m *Message) Status(arg ...Any) *Message { } list = append(list, kit.Dict(NAME, args[i], VALUE, args[i+1])) } - m.Option(MSG_STATUS, kit.Format(list)) - return m + return m.Options(MSG_STATUS, kit.Format(list)) } func (m *Message) StatusTime(arg ...Any) *Message { return m.Status(TIME, m.Time(), arg, kit.MDB_COST, m.FormatCost()) diff --git a/render.go b/render.go index 7454e242..1a382d58 100644 --- a/render.go +++ b/render.go @@ -7,15 +7,13 @@ import ( kit "shylinux.com/x/toolkits" ) -func AddRender(key string, render func(*Message, ...Any) string) { - Info.render[key] = render -} +func AddRender(key string, render func(*Message, ...Any) string) { Info.render[key] = render } func RenderAction(key ...string) Actions { return Actions{CTX_INIT: {Hand: func(m *Message, arg ...string) { cmd := m.CommandKey() - for _, key := range key { + kit.For(key, func(key string) { AddRender(key, func(m *Message, arg ...Any) string { return m.Cmd(cmd, key, arg).Result() }) - } + }) }}} } func Render(m *Message, cmd string, args ...Any) string { @@ -28,25 +26,15 @@ func Render(m *Message, cmd string, args ...Any) string { for _, k := range args { switch k := k.(type) { case []string: - for _, k := range k { - list = append(list, Render(m, RENDER_BUTTON, k)) - } + kit.For(k, func(k string) { list = append(list, Render(m, RENDER_BUTTON, k)) }) case string: if strings.HasPrefix(k, "`, - // k, kit.Select(k, kit.Value(m._cmd.Meta, kit.Keys("_trans", k)), m.Option(MSG_LANGUAGE) != "en"))) - k, k)) - } + kit.For(kit.Split(k), func(k string) { list = append(list, kit.Format(``, k, k)) }) case Map: - for k := range k { - list = append(list, kit.Format(``, - k, k)) - // k, kit.Select(k, v, m.Option(MSG_LANGUAGE) != "en"))) - } + kit.For(k, func(k string) { list = append(list, kit.Format(``, k, k)) }) default: list = append(list, Render(m, RENDER_BUTTON, kit.Format(k))) } @@ -66,16 +54,14 @@ func Render(m *Message, cmd string, args ...Any) string { if len(arg) == 1 { return kit.Format(`<%s>%s`, cmd, arg[0], cmd) } - return kit.Format(`<%s style="%s">%s`, cmd, kit.JoinKV(":", ";", arg[1:]...), arg[0], cmd) + return kit.Format(`<%s style="%s">%s`, cmd, kit.JoinKV(DF, ";", arg[1:]...), arg[0], cmd) } } func (m *Message) Render(cmd string, arg ...Any) *Message { switch cmd { case RENDER_TEMPLATE: - if len(arg) == 1 { - arg = append(arg, m) - } + kit.If(len(arg) == 1, func() { arg = append(arg, m) }) if res, err := kit.Render(arg[0].(string), arg[1]); m.Assert(err) { m.Echo(string(res)) } @@ -117,36 +103,12 @@ func (m *Message) RenderVoid(arg ...Any) *Message { return m.Render(RENDER_VOID, arg...) } -func (m *Message) IsCliUA() bool { - if m.Option(MSG_USERUA) == "" || !strings.HasPrefix(m.Option(MSG_USERUA), "Mozilla") { - return true - } - return false -} -func (m *Message) IsMobileUA() bool { - return strings.Contains(m.Option(MSG_USERUA), "Mobile") -} -func (m *Message) MergePodCmd(pod, cmd string, arg ...Any) string { - ls := []string{"chat"} - kit.If(kit.Keys(m.Option(MSG_USERPOD), pod), func(p string) { ls = append(ls, POD, p) }) - if cmd == "" { - if _, ok := Info.Index[m.CommandKey()]; ok { - cmd = m.CommandKey() - } else { - cmd = m.PrefixKey() - } - } - ls = append(ls, CMD, cmd) - return kit.MergeURL2(strings.Split(kit.Select(Info.Domain, m.Option(MSG_USERWEB)), QS)[0], PS+kit.Join(ls, PS), arg...) -} func (m *Message) PushSearch(arg ...Any) { data := kit.Dict(arg...) for i := 0; i < len(arg); i += 2 { switch k := arg[i].(type) { case string: - if i+1 < len(arg) { - data[k] = arg[i+1] - } + kit.If(i+1 < len(arg), func() { data[k] = arg[i+1] }) } } for _, k := range kit.Split(m.OptionFields()) { @@ -170,7 +132,6 @@ func (m *Message) PushAction(arg ...Any) *Message { } return m.Set(MSG_APPEND, ACTION).Tables(func(value Maps) { m.PushButton(arg...) }) } - func (m *Message) PushButton(arg ...Any) *Message { if !m.IsCliUA() { if m.FieldsIsDetail() { @@ -188,68 +149,37 @@ func (m *Message) PushButton(arg ...Any) *Message { return m } func (m *Message) PushAnchor(arg ...string) { - if !m.IsCliUA() { - m.Push(LINK, Render(m, RENDER_ANCHOR, arg)) - } + kit.If(!m.IsCliUA(), func() { m.Push(LINK, Render(m, RENDER_ANCHOR, arg)) }) } func (m *Message) PushQRCode(key, src string) { - if !m.IsCliUA() { - m.Push(key, Render(m, RENDER_QRCODE, src)) - } + kit.If(!m.IsCliUA(), func() { m.Push(key, Render(m, RENDER_QRCODE, src)) }) } func (m *Message) PushImages(key, src string) { - if !m.IsCliUA() { - m.Push(key, Render(m, RENDER_IMAGES, src)) - } + kit.If(!m.IsCliUA(), func() { m.Push(key, Render(m, RENDER_IMAGES, src)) }) } func (m *Message) PushVideos(key, src string) { - if !m.IsCliUA() { - m.Push(key, Render(m, RENDER_VIDEOS, src)) - } + kit.If(!m.IsCliUA(), func() { m.Push(key, Render(m, RENDER_VIDEOS, src)) }) } func (m *Message) PushAudios(key, src string) { - if !m.IsCliUA() { - m.Push(key, Render(m, RENDER_AUDIOS, src)) - } + kit.If(!m.IsCliUA(), func() { m.Push(key, Render(m, RENDER_AUDIOS, src)) }) } func (m *Message) PushIFrame(key, src string) { - if !m.IsCliUA() { - m.Push(key, Render(m, RENDER_IFRAME, src)) - } + kit.If(!m.IsCliUA(), func() { m.Push(key, Render(m, RENDER_IFRAME, src)) }) } func (m *Message) PushScript(arg ...string) { - if !m.IsCliUA() { - m.Push(SCRIPT, Render(m, RENDER_SCRIPT, arg)) - } + kit.If(!m.IsCliUA(), func() { m.Push(SCRIPT, Render(m, RENDER_SCRIPT, arg)) }) } -func (m *Message) PushDownload(key string, arg ...string) *Message { - if !m.IsCliUA() { - m.Push(key, Render(m, RENDER_DOWNLOAD, arg)) - } - return m +func (m *Message) PushDownload(key string, arg ...string) { + kit.If(!m.IsCliUA(), func() { m.Push(key, Render(m, RENDER_DOWNLOAD, arg)) }) } -func (m *Message) EchoButton(arg ...Any) *Message { - return m.Echo(Render(m, RENDER_BUTTON, arg...)) -} -func (m *Message) EchoAnchor(arg ...string) *Message { - return m.Echo(Render(m, RENDER_ANCHOR, arg)) -} -func (m *Message) EchoQRCode(src string) *Message { - return m.Echo(Render(m, RENDER_QRCODE, src)) -} -func (m *Message) EchoImages(src string) *Message { - return m.Echo(Render(m, RENDER_IMAGES, src)) -} -func (m *Message) EchoVideos(src string) *Message { - return m.Echo(Render(m, RENDER_VIDEOS, src)) -} -func (m *Message) EchoIFrame(src string) *Message { - return m.Echo(Render(m, RENDER_IFRAME, src)) -} -func (m *Message) EchoScript(arg ...string) *Message { - return m.Echo(Render(m, RENDER_SCRIPT, arg)) -} +func (m *Message) EchoButton(arg ...Any) *Message { return m.Echo(Render(m, RENDER_BUTTON, arg...)) } +func (m *Message) EchoAnchor(arg ...string) *Message { return m.Echo(Render(m, RENDER_ANCHOR, arg)) } +func (m *Message) EchoQRCode(src string) *Message { return m.Echo(Render(m, RENDER_QRCODE, src)) } +func (m *Message) EchoImages(src string) *Message { return m.Echo(Render(m, RENDER_IMAGES, src)) } +func (m *Message) EchoVideos(src string) *Message { return m.Echo(Render(m, RENDER_VIDEOS, src)) } +func (m *Message) EchoIFrame(src string) *Message { return m.Echo(Render(m, RENDER_IFRAME, src)) } +func (m *Message) EchoScript(arg ...string) *Message { return m.Echo(Render(m, RENDER_SCRIPT, arg)) } func (m *Message) EchoDownload(arg ...string) *Message { return m.Echo(Render(m, RENDER_DOWNLOAD, arg)) } diff --git a/type.go b/type.go index 9d3a2267..a1d09d6d 100644 --- a/type.go +++ b/type.go @@ -2,7 +2,6 @@ package ice import ( "encoding/json" - "fmt" "io" "net/http" "strings" @@ -180,24 +179,18 @@ func (c *Context) Merge(s *Context) *Context { } func (c *Context) Begin(m *Message, arg ...string) *Context { kit.If(c.Caches == nil, func() { c.Caches = Caches{} }) - c.Caches[CTX_STREAM] = &Cache{Name: CTX_STREAM, Value: ""} - c.Caches[CTX_STATUS] = &Cache{Name: CTX_STATUS, Value: CTX_BEGIN} c.Caches[CTX_FOLLOW] = &Cache{Name: CTX_FOLLOW, Value: c.Name} kit.If(c.context != nil && c.context != Index, func() { c.Cap(CTX_FOLLOW, kit.Keys(c.context.Cap(CTX_FOLLOW), c.Name)) }) kit.If(c.server != nil, func() { c.server.Begin(m, arg...) }) return c.Merge(c) } -func (c *Context) Start(m *Message, arg ...string) bool { - m.Log(c.Cap(CTX_STATUS, CTX_START), c.Cap(CTX_FOLLOW)) - kit.If(c.server != nil, func() { - m.Go(func() { c.server.Start(m, arg...) }, m.Prefix()) - }) - return true +func (c *Context) Start(m *Message, arg ...string) { + m.Log(CTX_START, c.Cap(CTX_FOLLOW)) + kit.If(c.server != nil, func() { m.Go(func() { c.server.Start(m, arg...) }, m.Prefix()) }) } -func (c *Context) Close(m *Message, arg ...string) bool { - m.Log(c.Cap(CTX_STATUS, CTX_CLOSE), c.Cap(CTX_FOLLOW)) +func (c *Context) Close(m *Message, arg ...string) { + m.Log(CTX_CLOSE, c.Cap(CTX_FOLLOW)) kit.If(c.server != nil, func() { c.server.Close(m, arg...) }) - return true } type Message struct { @@ -225,26 +218,14 @@ type Message struct { I io.Reader } -func (m *Message) Time(arg ...Any) string { +func (m *Message) Time(arg ...string) string { t := m.time if len(arg) > 0 { - switch arg := arg[0].(type) { - case string: - if d, e := time.ParseDuration(arg); e == nil { - t, arg = t.Add(d), arg[1:] - } + if d, e := time.ParseDuration(arg[0]); e == nil { + t, arg = t.Add(d), arg[1:] } } - f := MOD_TIME - if len(arg) > 0 { - switch p := arg[0].(type) { - case string: - if f = p; len(arg) > 1 { - f = fmt.Sprintf(f, arg[1:]...) - } - } - } - return t.Format(f) + return t.Format(kit.Select(MOD_TIME, arg, 0)) } func (m *Message) Target() *Context { return m.target } func (m *Message) Source() *Context { return m.source } @@ -348,22 +329,10 @@ func (m *Message) Search(key string, cb Any) *Message { } switch cb := cb.(type) { case func(key string, cmd *Command): - if key == "" { - for k, v := range p.Commands { - cb(k, v) - } - break - } if cmd, ok := p.Commands[key]; ok { cb(key, cmd) } case func(p *Context, s *Context, key string, cmd *Command): - if key == "" { - for k, v := range p.Commands { - cb(p.context, p, k, v) - } - break - } for _, p := range []*Context{p, m.target, m.source} { for s := p; s != nil; s = s.context { if cmd, ok := s.Commands[key]; ok { @@ -373,12 +342,6 @@ func (m *Message) Search(key string, cb Any) *Message { } } case func(p *Context, s *Context, key string, conf *Config): - if key == "" { - for k, v := range p.Configs { - cb(p.context, p, k, v) - } - break - } for _, p := range []*Context{p, m.target, m.source} { for s := p; s != nil; s = s.context { if cmd, ok := s.Configs[key]; ok { @@ -387,8 +350,6 @@ func (m *Message) Search(key string, cb Any) *Message { } } } - case func(p *Context, s *Context, key string): - cb(p.context, p, key) case func(p *Context, s *Context): cb(p.context, p) default: @@ -397,17 +358,13 @@ func (m *Message) Search(key string, cb Any) *Message { return m } -func (m *Message) Cmd(arg ...Any) *Message { return m._command(arg...) } -func (m *Message) Cmds(arg ...Any) *Message { return m.Go(func() { m._command(arg...) }) } +func (m *Message) Cmd(arg ...Any) *Message { return m._command(arg...) } func (m *Message) Cmdx(arg ...Any) string { res := kit.Select("", m._command(arg...).meta[MSG_RESULT], 0) return kit.Select("", res, res != ErrWarn) } func (m *Message) Cmdy(arg ...Any) *Message { return m.Copy(m._command(arg...)) } func (m *Message) Confv(arg ...Any) (val Any) { - if m.Spawn().Warn(Info.Important && m.Option("_lock") == "") { - m.Warn(true, "what unsafe lock", m.PrefixKey(), m.FormatStack(1, 100)) - } run := func(conf *Config) { if len(arg) == 1 { val = conf.Value @@ -433,24 +390,3 @@ func (m *Message) Confv(arg ...Any) (val Any) { return } func (m *Message) Conf(arg ...Any) string { return kit.Format(m.Confv(arg...)) } -func (m *Message) Capi(key string, val ...Any) int { - kit.If(len(val) > 0, func() { m.Cap(key, kit.Int(m.Cap(key))+kit.Int(val[0])) }) - return kit.Int(m.Cap(key)) -} -func (m *Message) Capv(arg ...Any) Any { - key := "" - switch val := arg[0].(type) { - case string: - key, arg = val, arg[1:] - } - for _, s := range []*Context{m.target} { - for c := s; c != nil; c = c.context { - if caps, ok := c.Caches[key]; ok { - kit.If(len(arg) > 0, func() { caps.Value = kit.Format(arg[0]) }) - return caps.Value - } - } - } - return nil -} -func (m *Message) Cap(arg ...Any) string { return kit.Format(m.Capv(arg...)) }