Как извлечь только те наборы флагов, которые явно установлены в cli? - PullRequest
0 голосов
/ 26 января 2019

Я новичок в Кобра и Гадюка .

Я хотел знать, есть ли способ исключить значения флагов, которые не установлены пользователем, из 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 в настоящее время выглядит следующим образом:

  1. Иметь массив командных флагов.Инициализируйте пустой map[string]interface{}
  2. Перебирайте массив и проверяйте, установлен или изменен флаг, с помощью flags.Changed("flag").Если флаг изменен, то добавьте его на карту
  3. Преобразуйте карту в json
  4. 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, так как она импортируется из внешнего пакета.

Спасибо.Ваша помощь очень ценится.

1 Ответ

0 голосов
/ 26 января 2019

Предположим, что ваша User структура выглядит так:

type User struct {
    ...
    age     int
    address string
    ...
}

Тогда по умолчанию при инициализации структуры User будет установлено age => 0, address => 0. Так что, даже если Viper не устанавливает значения по умолчанию. Иди внутренне, будет.

Я предлагаю следующее:
1. Изменить способ создания пользовательской структуры

type User struct {
    ...
    age     *int
    address *string
    ...
}
  1. Установите значения по умолчанию в кобре на nil для обоих этих полей.
    Таким образом, вы бы знали, что по умолчанию Cobra не устанавливает значение. Всякий раз, когда значение установлено, оно будет не nil. Надеюсь, это поможет!
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...