/
gkshell.go
88 lines (83 loc) · 1.96 KB
/
gkshell.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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
package goktrl
import (
"encoding/json"
"fmt"
"os"
"strings"
"github.com/abiosoft/ishell/v2"
)
/*
为shell增加参数解析功能
*/
type KtrlShell struct {
*ishell.Shell
}
func NewShell() *KtrlShell {
return &KtrlShell{
Shell: ishell.New(),
}
}
func (that *KtrlShell) AddCmd(kcmd *KCommand) {
if kcmd.ArgsDescription == "" {
kcmd.ArgsDescription = "no descriptions for args."
}
that.Shell.AddCmd(&ishell.Cmd{
Name: strings.ReplaceAll(kcmd.Name, " ", ""),
Help: kcmd.Help,
LongHelp: fmt.Sprintf("%s%s\n args: \n %s", kcmd.Help, ShowHelpStr(kcmd.Opts), kcmd.ArgsDescription),
Func: func(c *ishell.Context) {
os.Args = c.Args
kc := &Context{
Type: ContextClient,
ShellContext: c,
KtrlPath: kcmd.GetKtrlPath(),
DefaultSocket: kcmd.SocketName,
ShellCmdName: kcmd.Name,
}
kc.Options, kc.Parser = ParseShellOptions(kcmd.Opts, kcmd)
if kc.Parser == nil {
return
}
kc.Args = kc.Parser.GetArgAll()
if kcmd.ArgsHook != nil {
kc.Args = kcmd.ArgsHook(kc.Args)
}
if kcmd.ArgsRequired && len(kc.Args) == 0 {
fmt.Println("At least one argument must be provided!")
return
}
if kcmd.ShowTable {
// 结果以table形式显示,table的数据在cmd.Func中获取
kc.Table = NewKtrlTable()
}
// 全自动获取result并显示
if kcmd.Auto {
var err error
kc.Result, err = kc.GetResult()
if err != nil {
fmt.Println(err)
return
}
if !kcmd.ShowTable {
// 普通结果显示
fmt.Println(string(kc.Result))
} else if kcmd.TableObject != nil {
// 自动显示表格
if err = json.Unmarshal(kc.Result, kcmd.TableObject); err != nil {
fmt.Println(err)
}
kc.Table.AddRowsByListObject(kcmd.TableObject)
} else {
fmt.Println("Table object is required!")
}
}
if kcmd.Func != nil {
kcmd.Func(kc)
}
if kc.Table != nil && kcmd.ShowTable {
// 渲染表格
kc.Table.Render()
}
},
})
}