Я новичок в Кобра и Гадюка .
Я хотел знать, есть ли способ исключить значения флагов, которые не установлены пользователем, из cli.Так что моя проблема в том, что у меня есть несколько необязательных флагов в моей кобре cmd
, которые имеют значения по умолчанию.Интересно, есть ли способ исключить эти необязательные флаги, если они не установлены пользователем для обработки?Или, с другой стороны, есть ли способ извлечь флаги, которые были явно изменены пользователем, из cli из cmd
flagset?
Вот пример, чтобы лучше проиллюстрировать мой случай:
var cmd = &cobra.Command{
Use: "command [operations]",
Short: "Perform some commands",
Run: func(cmd *cobra.Command, args []string) {
var user User
err := viper.Unmarshal(&user)
fmt.Println(err)
fmt.Println(user)
},
}
cmd.PersistentFlags().String("name", "", "Your Name (Required)")
cmd.PersistentFlags().String("description", "", "Description")
cmd.PersistentFlags().String("address", "", "Address")
cmd.PersistentFlags().Int("age", -1, "Age")
cmd.MarkPersistentFlagRequired("name")
viper.BindPFlags(cmd.PersistentFlags())
Итак, предположим, что для возраста и адреса я хочу, чтобы они были необязательными и не распространялись при передаче в struct.Таким образом, это означает, что в cli пользователь не обязан отправлять флаги age
и address
, а значения по умолчанию для этих необязательных флагов равны нулю.Однако флаги Int & String строго типизированы, поэтому для них требуются значения по умолчанию (например, ""
и -1
).В результате, когда я связываю команду pflags с viper, а пользователь не вводит значения возраста и адреса в cli, viper получает ""
для адреса и -1
для возраста.Используя вышеупомянутый метод, значения по умолчанию будут распространены на структуру User.
Я хочу исключить значения флага, которые не установлены пользователем.Могу ли я исключить структуру User из получения значений флагов, которые явно не установлены пользователем?
Мое текущее решение исключить обработку незаданных флагов из структуры User в настоящее время выглядит следующим образом:
- Иметь массив командных флагов.Инициализируйте пустой
map[string]interface{}
- Перебирайте массив и проверяйте, установлен или изменен флаг, с помощью
flags.Changed("flag")
.Если флаг изменен, то добавьте его на карту - Преобразуйте карту в json
Unmarshal объект json в struct
// inside the Run function of a cobra command
aMap := make(map[string]interface{})
flags := cmd.Flags()
for _, flag := range cmdFlags {
if flags.Changed(flag) {
aMap[flag] = viper.Get(flag)
}
}
jsonStr, _ := json.Marshal(aMap)
var user User
json.Unmarshal(jsonStr, &user)
fmt.Println(user)
НоМне было интересно, есть ли лучшая альтернатива, чем мое решение выше.Предпочтительно я не хочу ничего менять в структуре User
, так как она импортируется из внешнего пакета.
Спасибо.Ваша помощь очень ценится.