forked from aliyun/aliyun-cli
-
Notifications
You must be signed in to change notification settings - Fork 0
/
context.go
113 lines (98 loc) · 2.21 KB
/
context.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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
/*
* Copyright (C) 2017-2018 Alibaba Group Holding Limited
*/
package cli
import (
"fmt"
"github.com/aliyun/aliyun-cli/i18n"
)
//
// default help flag
var HelpFlag = &Flag{
Name: "help",
Short: i18n.T("print help", "打印帮助信息"),
AssignedMode: AssignedNone,
}
//
// CLI Command Context
type Context struct {
help bool
flags *FlagSet
unknownFlags *FlagSet
command *Command
completion *Completion
}
func NewCommandContext() *Context {
return &Context{
flags: NewFlagSet(),
unknownFlags: nil,
}
}
func (ctx *Context) IsHelp() bool {
return ctx.help
}
func (ctx *Context) Command() *Command {
return ctx.command
}
func (ctx *Context) Completion() *Completion {
return ctx.completion
}
func (ctx *Context) Flags() *FlagSet {
return ctx.flags
}
func (ctx *Context) UnknownFlags() *FlagSet {
return ctx.unknownFlags
}
//
// Before go into the sub command, we need traverse flags and merge with parent
func (ctx *Context) EnterCommand(cmd *Command) {
ctx.command = cmd
if !cmd.EnableUnknownFlag {
ctx.unknownFlags = nil
} else if ctx.unknownFlags == nil {
ctx.unknownFlags = NewFlagSet()
}
ctx.flags = cmd.flags.mergeWith(ctx.flags, func(f *Flag) bool {
return f.Persistent
})
ctx.flags.Add(HelpFlag)
}
func (ctx *Context) CheckFlags() error {
for _, f := range ctx.flags.Flags() {
if !f.IsAssigned() {
if f.Required {
return fmt.Errorf("missing flag --%s", f.Name)
}
} else {
if err := f.checkFields(); err != nil {
return err
}
if len(f.ExcludeWith) > 0 {
for _, es := range f.ExcludeWith {
if _, ok := ctx.flags.GetValue(es); ok {
return fmt.Errorf("flag --%s is exclusive with --%s", f.Name, es)
}
}
}
}
}
return nil
}
func (ctx *Context) detectFlag(name string) (*Flag, error) {
flag := ctx.flags.Get(name)
if flag != nil {
return flag, nil
} else if ctx.unknownFlags != nil {
return ctx.unknownFlags.AddByName(name)
} else {
return nil, NewInvalidFlagError(name, ctx)
}
}
func (ctx *Context) detectFlagByShorthand(ch rune) (*Flag, error) {
flag := ctx.flags.GetByShorthand(ch)
if flag != nil {
return flag, nil
} else {
return nil, fmt.Errorf("unknown flag -%s", string(ch))
}
}