mirror of
https://github.com/spf13/cobra
synced 2025-05-05 21:07:24 +00:00
85 lines
1.8 KiB
Go
85 lines
1.8 KiB
Go
|
package cmd
|
||
|
|
||
|
import (
|
||
|
"errors"
|
||
|
"fmt"
|
||
|
"strings"
|
||
|
)
|
||
|
|
||
|
var specialFlagTypes = []string{"stringMapFlag", "genericMapFlag"}
|
||
|
|
||
|
// Indexes for flag definition string after split {name}:{type}:{description}
|
||
|
const (
|
||
|
FlagDefLength = 3
|
||
|
FlagDefSeparator = ":"
|
||
|
FlagDefault = ` "",`
|
||
|
FlagNameIndex = 0
|
||
|
FlagTypeIndex = 1
|
||
|
FlagDescriptionIndex = 2
|
||
|
)
|
||
|
|
||
|
type flagDefinition struct {
|
||
|
Name string
|
||
|
FlagType string
|
||
|
FlagDescription string
|
||
|
CreateFn string
|
||
|
VarName string
|
||
|
Default string
|
||
|
CmdName string
|
||
|
}
|
||
|
|
||
|
func printFlagVars(iFlags interface{}) string {
|
||
|
flags := toFlagArray(iFlags)
|
||
|
varDefs := ""
|
||
|
for _, f := range flags {
|
||
|
varDefs += fmt.Sprintf("var %s %s\n", f.VarName, f.FlagType)
|
||
|
}
|
||
|
return varDefs
|
||
|
}
|
||
|
|
||
|
func printFlagCreates(iFlags interface{}) string {
|
||
|
flags := toFlagArray(iFlags)
|
||
|
createStrs := ""
|
||
|
for _, f := range flags {
|
||
|
createStrs += fmt.Sprintf( `%sCmd.Flags().%s(&%s, "%s",%s "%s")
|
||
|
`,
|
||
|
f.CmdName,
|
||
|
f.CreateFn,
|
||
|
f.VarName,
|
||
|
f.Name,
|
||
|
f.Default,
|
||
|
f.FlagDescription)
|
||
|
}
|
||
|
return createStrs
|
||
|
}
|
||
|
|
||
|
func toFlagArray(value interface{}) []flagDefinition {
|
||
|
switch v := value.(type) {
|
||
|
case []flagDefinition:
|
||
|
return v
|
||
|
// Add whatever other types you need
|
||
|
default:
|
||
|
return []flagDefinition{}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func buildFlag(in, cmdName string) (flagDefinition, error) {
|
||
|
var def flagDefinition
|
||
|
values := strings.Split(in, FlagDefSeparator)
|
||
|
if len(values) != FlagDefLength {
|
||
|
return def, errors.New("invalid flag definition, make sure to specify flags as 'name:type:definition' they are all required")
|
||
|
}
|
||
|
name, flagType, desc := values[FlagNameIndex], values[FlagTypeIndex],values[FlagDescriptionIndex]
|
||
|
def = flagDefinition{
|
||
|
Name: name,
|
||
|
FlagType: flagType,
|
||
|
FlagDescription: desc,
|
||
|
CreateFn: fmt.Sprintf("%s%s", strings.Title(flagType), "Var"),
|
||
|
VarName: fmt.Sprintf("%s%sFlag", cmdName, name),
|
||
|
Default:FlagDefault,
|
||
|
CmdName: cmdName,
|
||
|
}
|
||
|
|
||
|
return def, nil
|
||
|
}
|