cli/opt-string-array.go
2025-12-11 07:57:48 +01:00

86 lines
2.3 KiB
Go

package cli
import (
"strings"
)
const (
stringArrayTypeName = "string-array"
)
type cliOptionStringArray struct {
cliOptionBase
defaultValue []string
targetVar *[]string
}
func (opt *cliOptionStringArray) init() {
opt.isArray = true
if opt.targetVar != nil {
*opt.targetVar = opt.defaultValue
}
}
func (opt *cliOptionStringArray) getTargetVar() (any, string) {
var value []string
if opt.targetVar != nil {
value = *opt.targetVar
}
return value, stringArrayTypeName
}
func (opt *cliOptionStringArray) requiresValue() bool {
return opt.targetVar != nil
}
func (opt *cliOptionStringArray) getDefaultValue() string {
return strings.Join(opt.defaultValue, ",")
}
func (opt *cliOptionStringArray) getTemplate() string {
return opt.makeOptTemplate(true, "string")
}
// parse retrieves the option value from the parser and updates the target variable.
// It handles comma-separated values and special values if configured.
func (opt *cliOptionStringArray) parse(parser cliParser, argIndex int, valuePtr *string) (skipNextArg bool, err error) {
var value string
if value, skipNextArg, err = opt.fetchOptionValue(parser, argIndex, valuePtr); err == nil {
var boxedValue any
if boxedValue, err = opt.getSpecialValue(parser, value, opt.targetVar); err == nil {
if opt.targetVar != nil {
if boxedValue != nil {
if val, ok := boxedValue.([]string); ok {
*opt.targetVar = val
} else {
err = errInvalidOptionValue(opt.name, boxedValue, "array of string")
}
} else {
*opt.targetVar = strings.Split(value, ",")
}
}
}
}
return
}
// AddStringArrayOpt adds a new string array option to the CLI parser.
// It takes the name, short alias, target variable, default value, description, and optional aliases.
// It returns a reference to the created option.
func (cli *CliParser) AddStringArrayOpt(name, short string, targetVar *[]string, defaultValue []string, description string, aliases ...string) OptReference {
aliases = cli.checkAlreadyUsedNames(name, short, aliases)
opt := &cliOptionStringArray{
cliOptionBase: cliOptionBase{
name: name,
shortAlias: short,
aliases: aliases,
description: description,
isArray: true,
},
targetVar: targetVar,
defaultValue: defaultValue,
}
cli.options = append(cli.options, opt)
return opt
}