1
0
forked from x/ContextOS

mac add ctx.append

This commit is contained in:
shaoying 2018-07-01 14:09:11 +08:00
parent 723d1824d6
commit d0c3239901
3 changed files with 166 additions and 65 deletions

View File

@ -47,7 +47,7 @@ func (cli *CLI) Spawn(m *ctx.Message, c *ctx.Context, arg ...string) ctx.Server
s.lex = cli.lex
s.yac = cli.yac
s.nfs = cli.nfs
s.target = cli.target
s.target = m.Source()
if len(arg) > 0 {
s.target = c
}
@ -204,6 +204,7 @@ func (cli *CLI) Start(m *ctx.Message, arg ...string) bool { // {{{
for i, v := range arg {
cli.Caches[fmt.Sprintf("%d", i)] = &ctx.Cache{Name: "执行参数", Value: v, Help: "执行参数"}
}
cli.Caches["current_cli"] = &ctx.Cache{Name: "当前命令中心", Value: fmt.Sprintf("%d", m.Code()), Help: "当前命令中心"}
if m.Has("level") {
m.Cap("level", m.Option("level"))
@ -666,9 +667,16 @@ var Index = &ctx.Context{Name: "cli", Help: "管理中心",
} // }}}
}},
"source": &ctx.Command{Name: "source file", Help: "运行脚本, file: 脚本文件名", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) {
if _, ok := m.Target().Server.(*CLI); m.Assert(ok) && !m.Caps("skip") { // {{{
m.Start(fmt.Sprintf("%s_%d_%s", key, m.Optioni("level", m.Capi("level")+1), arg[0]), "脚本文件", arg[0])
<-m.Target().Exit
target := m.Target()
if _, ok := m.Source().Server.(*CLI); ok {
target = m.Source()
}
if !m.Caps("skip") { // {{{
msg := m.Spawn(target)
msg.Start(fmt.Sprintf("%s_%d_%s", key, msg.Optioni("level", msg.Capi("level")+1), arg[0]), "脚本文件", arg[0])
<-msg.Target().Exit
m.Copy(msg, "result").Copy(msg, "append")
} // }}}
}},
"return": &ctx.Command{Name: "return result...", Help: "结束脚本, rusult: 返回值", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) {

View File

@ -894,6 +894,7 @@ func (m *Message) Sess(key string, arg ...string) *Message { // {{{
// }}}
func (m *Message) Sesss(key string, arg ...interface{}) *Message { // {{{
spawn := true
if _, ok := m.Sessions[key]; !ok && len(arg) > 0 {
switch value := arg[0].(type) {
case *Message:
@ -902,8 +903,7 @@ func (m *Message) Sesss(key string, arg ...interface{}) *Message { // {{{
case *Context:
m.Sessions[key] = m.Spawn(value)
return m.Sessions[key]
}
case string:
root := true
if len(arg) > 2 {
root = Right(arg[2].(string))
@ -915,17 +915,23 @@ func (m *Message) Sesss(key string, arg ...interface{}) *Message { // {{{
switch method {
case "find":
m.Sessions[key] = m.Find(arg[0].(string), root)
m.Sessions[key] = m.Find(value, root)
case "search":
m.Sessions[key] = m.Search(arg[0].(string), root)[0]
m.Sessions[key] = m.Search(value, root)[0]
}
return m.Sessions[key]
case bool:
spawn = value
}
}
for msg := m; msg != nil; msg = msg.message {
if x, ok := msg.Sessions[key]; ok {
if spawn {
return m.Spawn(x.target)
}
return x
}
}
return nil
@ -1303,6 +1309,12 @@ func (m *Message) Insert(meta string, index int, arg ...interface{}) string { //
if m.Meta == nil {
m.Meta = make(map[string][]string)
}
if len(arg) == 0 {
if -1 < index && index < len(m.Meta[meta]) {
return m.Meta[meta][index]
}
return ""
}
str := []string{}
for _, v := range arg {
@ -2268,6 +2280,9 @@ var Index = &Context{Name: "ctx", Help: "模块中心",
"key": &Config{Name: "私钥文件", Value: "etc/key.pem", Help: "私钥文件"},
"command_list_base": &Config{Name: "命令列表的起始位置", Value: "0", Help: "命令列表的起始位置"},
"search_method": &Config{Name: "search_method(find/search)", Value: "find", Help: "搜索方法, find: 模块名精确匹配, search: 模块名或帮助信息模糊匹配"},
"search_index": &Config{Name: "search_index", Value: "0", Help: "搜索索引"},
},
Commands: map[string]*Command{
"help": &Command{Name: "help topic", Help: "帮助", Hand: func(m *Message, c *Context, key string, arg ...string) {
@ -2419,51 +2434,133 @@ var Index = &Context{Name: "ctx", Help: "模块中心",
// }}}
}},
"option": &Command{Name: "option", Help: "查看消息", Hand: func(m *Message, c *Context, key string, arg ...string) {
for msg := m; msg != nil; msg = msg.message { // {{{
if len(arg) == 0 {
m.Echo("%d(%s->%s): %v\n", msg.code, msg.source.Name, msg.target.Name, msg.Meta["detail"])
"detail": &Command{Name: "detail [index]", Help: "查看或添加参数", Hand: func(m *Message, c *Context, key string, arg ...string) {
msg := m.Sesss("cli", false) // {{{
switch len(arg) {
case 0:
m.Echo("%v\n", msg.Meta["detail"])
case 1:
if i, e := strconv.Atoi(arg[0]); e == nil {
m.Echo(msg.Detail(i))
}
for _, k := range msg.Meta["option"] {
if v, ok := msg.Meta[k]; ok {
if len(arg) == 0 {
m.Echo(" %s: %v\n", k, v)
} else if k == arg[0] {
if len(arg) > 1 {
msg.Option(k, arg[1])
default:
if i, e := strconv.Atoi(arg[0]); e == nil {
m.Echo(msg.Detail(i, arg[1:]))
}
if len(v) > 0 {
m.Echo("%v", v[0])
}
}
}
}
}
// }}}
} // }}}
}},
"session": &Command{Name: "session", Help: "查看消息", Hand: func(m *Message, c *Context, key string, arg ...string) {
for msg := m; msg != nil; msg = msg.message { // {{{
if len(arg) == 0 {
m.Echo("%d(%s->%s): %v\n", msg.code, msg.source.Name, msg.target.Name, msg.Meta["detail"])
"option": &Command{Name: "option [key [value...]]", Help: "查看或添加选项", Hand: func(m *Message, c *Context, key string, arg ...string) {
for msg := m.Sesss("cli", false); msg != nil; msg = msg.message { // {{{
switch len(arg) {
case 0:
for _, k := range msg.Meta["option"] {
m.Echo("%s: %v\n", k, msg.Meta[k])
}
for k, v := range msg.Sessions {
if len(arg) == 0 {
m.Echo(" %s(%s->%s): %d(%s)\n", k, v.source.Name, v.target.Name, v.code, msg.time.Format("15:04:05"))
} else if k == arg[0] {
if len(arg) > 1 {
sub := msg.Sesss(k).Cmd(arg[1:])
m.Copy(sub, "result")
case 1:
for _, k := range msg.Meta["option"] {
if k == arg[0] {
m.Echo("%s", msg.Option(k))
return
}
m.Echo("msg(%s->%s): %d(%s)\n", msg.source.Name, msg.target.Name, msg.code, msg.time.Format("15:04:05"))
m.Echo(" %s(%s->%s): %d(%s)\n", k, v.source.Name, v.target.Name, msg.code, msg.time.Format("15:04:05"))
}
default:
msg.Option(arg[0], arg[1:])
return
}
} // }}}
}},
"result": &Command{Name: "result [value...]", Help: "查看或添加返回值", Hand: func(m *Message, c *Context, key string, arg ...string) {
msg := m.Sesss("cli", false) // {{{
switch len(arg) {
case 0:
m.Echo("%v\n", msg.Meta["result"])
default:
msg.Set("result", arg...)
} // }}}
}},
"append": &Command{Name: "append [key [value...]]", Help: "查看或添加附加值", Hand: func(m *Message, c *Context, key string, arg ...string) {
ms := []*Message{m.Sesss("cli", false)} // {{{
for i := 0; i < len(ms); i++ {
ms = append(ms, ms[i].messages...)
switch len(arg) {
case 0:
for _, k := range ms[i].Meta["append"] {
m.Echo("%s: %v\n", k, ms[i].Meta[k])
}
case 1:
for _, k := range ms[i].Meta["append"] {
if arg[0] == k {
m.Echo("%s", ms[i].Append(k))
return
}
}
default:
m.Echo(ms[i].Append(arg[0], arg[1:]))
return
}
} // }}}
}},
"session": &Command{Name: "session [key [name [find|search index]]]", Help: "查看或添加会话", Hand: func(m *Message, c *Context, key string, arg ...string) {
for msg := m.Sesss("cli", false); msg != nil; msg = msg.message { // {{{
switch len(arg) {
case 0:
for k, v := range msg.Sessions {
m.Echo("%s: %d(%s->%s) %v %v\n", k, v.code, v.source.Name, v.target.Name, v.Meta["detail"], v.Meta["option"])
}
case 1:
for k, v := range msg.Sessions {
if k == arg[0] {
m.Echo("%d", v.code)
return
}
}
default:
method := m.Confx("search_method", arg, 2)
index := m.Confx("search_index", arg, 3)
switch method {
case "find":
msg.Sessions[arg[0]] = msg.Find(arg[1])
case "search":
ms := msg.Search(arg[1])
if i, e := strconv.Atoi(index); e == nil && i < len(ms) {
msg.Sessions[arg[0]] = ms[i]
}
}
return
}
}
// }}}
}},
"callback": &Command{Name: "callback", Help: "查看消息", Hand: func(m *Message, c *Context, key string, arg ...string) {
for msg := m; msg != nil; msg = msg.message { // {{{
"callback": &Command{Name: "callback index", Help: "查看消息", Hand: func(m *Message, c *Context, key string, arg ...string) {
index := 0
for msg := m.Sesss("cli", false); msg != nil; msg = msg.message { // {{{
index--
switch len(arg) {
case 0:
if msg.callback.hand == nil {
return
}
m.Echo("%d: %v\n", index, msg.callback.hand)
case 1:
if msg.callback.hand == nil {
return
}
if i, e := strconv.Atoi(arg[0]); e == nil && i == index {
m.Echo("%v", msg.callback.hand)
}
default:
if i, e := strconv.Atoi(arg[0]); e == nil && i == index {
msg.callback.hand = func(msg *Message) *Message {
return msg
}
m.Echo("%v", msg.callback.hand)
}
return
}
continue
if len(arg) == 0 {
m.Echo("msg(%s->%s): %d(%s) %v\n", msg.source.Name, msg.target.Name, msg.code, msg.time.Format("15:04:05"), msg.Meta["detail"])
if msg.callback.hand != nil {

View File

@ -200,6 +200,7 @@ func (web *WEB) Spawn(m *ctx.Message, c *ctx.Context, arg ...string) ctx.Server
// }}}
func (web *WEB) Begin(m *ctx.Message, arg ...string) ctx.Server { // {{{
m.Sesss("cli", "cli")
web.Context.Master(nil)
web.Caches["route"] = &ctx.Cache{Name: "请求路径", Value: "/" + web.Context.Name + "/", Help: "请求路径"}
web.Caches["register"] = &ctx.Cache{Name: "已初始化(yes/no)", Value: "no", Help: "模块是否已初始化"}
@ -898,15 +899,10 @@ var Index = &ctx.Context{Name: "web", Help: "应用中心",
m.Add("append", "hi", "hello")
}},
"/demo": &ctx.Command{Name: "/demo", Help: "应用示例", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) {
w := m.Data["response"].(http.ResponseWriter)
w.Header().Add("Content-Type", "text/html")
tmpl := template.Must(template.New("fuck").Funcs(ctx.CGI).ParseGlob(m.Conf("template_dir") + "/common/*.html"))
m.Assert(tmpl)
m.Option("message", "hello")
tmpl.ExecuteTemplate(w, "head", m)
tmpl.ExecuteTemplate(w, "tail", m.Meta)
msg := m.Sesss("cli")
msg.Cmd("source", "etc/demo.shy")
m.Copy(msg, "result").Copy(msg, "append")
return
}},
},
}