-
Notifications
You must be signed in to change notification settings - Fork 0
/
value.go
98 lines (82 loc) · 1.43 KB
/
value.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
package nzflag
import (
"fmt"
"strings"
)
// ValueType represents type of Value
type ValueType int
const (
// TypeFlag is flag
TypeFlag ValueType = iota
// TypeArg is arg
TypeArg
)
// Value represents Arg or Flag
type Value interface {
fmt.Stringer
Type() ValueType
Flag() *Flag
Arg() *Arg
}
// Flag is cli flag
type Flag struct {
Name string
Values []string
}
// NewFlag returns flag instance
func NewFlag(name string, values ...string) *Flag {
if values == nil {
values = []string{}
}
return &Flag{name, values}
}
// Flag returns itself
func (v *Flag) Flag() *Flag {
return v
}
// Arg returns nil
func (v *Flag) Arg() *Arg {
return nil
}
// Type returns TypeFlag
func (v *Flag) Type() ValueType {
return TypeFlag
}
// String returns flag string
func (v *Flag) String() string {
name := v.Name
if len(name) == 1 {
name = "-" + v.Name
} else {
name = "--" + v.Name
}
value := strings.Join(v.Values, ",")
if len(value) == 0 {
return name
}
return fmt.Sprintf("%v=%v", name, value)
}
// Arg represets cli argument
type Arg struct {
Value string
}
// NewArg returns new Arg instance
func NewArg(value string) *Arg {
return &Arg{value}
}
// Flag returns nil
func (v *Arg) Flag() *Flag {
return nil
}
// Arg returns itself
func (v *Arg) Arg() *Arg {
return v
}
// Type returns TypeArg
func (v *Arg) Type() ValueType {
return TypeArg
}
// String returns arg string
func (v *Arg) String() string {
return v.Value
}