github.com/jfrog/jfrog-cli-core/v2@v2.51.0/plugins/components/commandcomp.go (about) 1 package components 2 3 import ( 4 "fmt" 5 "strconv" 6 ) 7 8 type Argument struct { 9 Name string 10 // Is this argument optional? If so, the 'Optional' field should be set to true. 11 // This field is used for creating help usages, for instance if argument is: 12 // Argument { 13 // Name: "optional-arg", 14 // Optional: true, 15 // } 16 // The help usage that will be created will be: 17 // 18 // Usage: 19 // 1) cmd-name [cmd options] [optional-arg] 20 // 21 // Else, if the argument is mandatory ( Argument { Name: "mandatory-arg" } ), the help usage will be: 22 // 23 // Usage: 24 // 1) cmd-name [cmd options] <mandatory-arg> 25 Optional bool 26 // Is this argument optional and can be replaced with a flag? 27 // If so, the 'Optional' field should be set to true and the 'ReplaceWithFlag' field should be set to the flag name. 28 // This field is used for creating help usages, for instance if argument is: 29 // Argument { 30 // Name: "optional-arg", 31 // Optional: true, 32 // ReplaceWithFlag: "flag-replacement", 33 // } 34 // The help usage that will be created will be: 35 // 36 // Usage: 37 // 1) cmd-name [cmd options] [optional-arg] 38 // 2) cmd-name [cmd options] --flag-replacement=value 39 ReplaceWithFlag string 40 Description string 41 } 42 43 type EnvVar struct { 44 Name string 45 Default string 46 Description string 47 } 48 49 type ActionFunc func(c *Context) error 50 51 type Context struct { 52 Arguments []string 53 CommandName string 54 stringFlags map[string]string 55 boolFlags map[string]bool 56 PrintCommandHelp func(commandName string) error 57 } 58 59 func (c *Context) GetStringFlagValue(flagName string) string { 60 return c.stringFlags[flagName] 61 } 62 63 func (c *Context) GetIntFlagValue(flagName string) (value int, err error) { 64 parsed, err := strconv.ParseInt(c.GetStringFlagValue(flagName), 0, 64) 65 if err != nil { 66 err = fmt.Errorf("can't parse int flag '%s': %w", flagName, err) 67 return 68 } 69 value = int(parsed) 70 return 71 } 72 73 func (c *Context) GetBoolFlagValue(flagName string) bool { 74 return c.boolFlags[flagName] 75 } 76 77 func (c *Context) IsFlagSet(flagName string) bool { 78 if _, exist := c.stringFlags[flagName]; exist { 79 return true 80 } 81 _, exist := c.boolFlags[flagName] 82 return exist 83 } 84 85 type Flag interface { 86 GetName() string 87 IsMandatory() bool 88 GetDescription() string 89 } 90 91 type BaseFlag struct { 92 Name string 93 Description string 94 Hidden bool 95 } 96 97 func NewFlag(name, description string) BaseFlag { 98 return BaseFlag{Name: name, Description: description} 99 } 100 101 func (f BaseFlag) GetName() string { 102 return f.Name 103 } 104 105 func (f BaseFlag) GetDescription() string { 106 return f.Description 107 } 108 109 func (f BaseFlag) IsMandatory() bool { 110 return false 111 } 112 113 type StringFlag struct { 114 BaseFlag 115 Mandatory bool 116 // A flag with default value cannot be mandatory. 117 DefaultValue string 118 // Optional. If provided, this field will be used for help usage. --<Name>=<HelpValue> else: --<Name>=<value> 119 HelpValue string 120 } 121 122 type StringFlagOption func(f *StringFlag) 123 124 func NewStringFlag(name, description string, options ...StringFlagOption) StringFlag { 125 f := StringFlag{BaseFlag: NewFlag(name, description)} 126 for _, option := range options { 127 option(&f) 128 } 129 return f 130 } 131 132 func (f StringFlag) GetDefault() string { 133 return f.DefaultValue 134 } 135 136 func (f StringFlag) IsMandatory() bool { 137 return f.Mandatory 138 } 139 140 func WithStrDefaultValue(defaultValue string) StringFlagOption { 141 return func(f *StringFlag) { 142 f.DefaultValue = defaultValue 143 } 144 } 145 146 func WithIntDefaultValue(defaultValue int) StringFlagOption { 147 return func(f *StringFlag) { 148 f.DefaultValue = strconv.Itoa(defaultValue) 149 } 150 } 151 152 func SetMandatory() StringFlagOption { 153 return func(f *StringFlag) { 154 f.Mandatory = true 155 } 156 } 157 158 func WithHelpValue(helpValue string) StringFlagOption { 159 return func(f *StringFlag) { 160 f.HelpValue = helpValue 161 } 162 } 163 164 func SetHiddenStrFlag() StringFlagOption { 165 return func(f *StringFlag) { 166 f.Hidden = true 167 } 168 } 169 170 type BoolFlag struct { 171 BaseFlag 172 DefaultValue bool 173 } 174 175 type BoolFlagOption func(f *BoolFlag) 176 177 func (f BoolFlag) GetDefault() bool { 178 return f.DefaultValue 179 } 180 181 func NewBoolFlag(name, description string, options ...BoolFlagOption) BoolFlag { 182 f := BoolFlag{BaseFlag: NewFlag(name, description)} 183 for _, option := range options { 184 option(&f) 185 } 186 return f 187 } 188 189 func WithBoolDefaultValue(defaultValue bool) BoolFlagOption { 190 return func(f *BoolFlag) { 191 f.DefaultValue = defaultValue 192 } 193 } 194 195 func SetHiddenBoolFlag() BoolFlagOption { 196 return func(f *BoolFlag) { 197 f.Hidden = true 198 } 199 }