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  }