Как использовать по умолчанию, если индекс не существует - PullRequest
0 голосов
/ 07 мая 2020

У меня есть следующие данные:

alerts:
  api_http_500:
    default_config:
      enabled: true
    override:
      user_1:
        enabled: false

Я хочу проверить, существует ли активированное поле для пользователя. Если это не так, я использую по умолчанию. Я использую index и default, как показано ниже:

{{ (index $alerts "alerts" "api_http_500" "override" "user_2" "enabled") | default (index $alerts "alerts" "api_http_500" "default_config" "enabled") }}

Но у меня есть эта ошибка <index $alerts "alerts" "user_2" "enabled">: error calling index: index of nil pointer.

Я не Не знаю, как использовать значение по умолчанию без структуры if / else.

1 Ответ

2 голосов
/ 08 мая 2020

Основная ошибка состоит в том, что в данных нет поля user_2, поэтому, когда вы пытаетесь его получить, вы получаете nil; вы не можете делать более глубокие поиски в этом. default все еще может прийти на помощь!

Go text/template язык поддерживает локальные переменные. Таким образом, мы можем установить для локальной переменной то, что должно быть значением user_2. Если его нет, библиотека поддержки Sprig включает функцию dict, которая может создавать пустой словарь.

{{- $overrides := index $alerts "user_2" | default dict -}}

Теперь $overrides всегда словарь, чтобы мы могли поискать в нем, или, если там ничего нет, вернуться к значениям по умолчанию.

{{- $a := index $alerts.alerts "api_http_500" -}}
{{- $defaults := $a.default_config -}}
{{- $overrides := index $a.override "user_2" | default dict -}}
{{- $enabled := $overrides.enabled | default $defaults.enabled -}}

Это выглядит хорошо, но еще одна проблема в том, что default не различает 1035 *sh присутствует-но-ложно из отсутствующего; оба являются ложными и будут заменены значением по умолчанию. Стандартный шаблон eq требует, чтобы значения имели один и тот же тип, но Sprig deepEqual не имеет этого требования.

Это позволяет вам написать подробный логический оператор, который должен быть включенным, если переопределение истинно или если переопределение не ложно (я не думаю, что есть способ указать «ноль» или «отсутствует»), а значение по умолчанию - истина.

{{- $enabled := or $overrides.enabled (and (not (deepEqual $overrides.enabled false)) $defaults.enabled) -}}

(Стоит подумать, хотите ли вы столько Go шаблона logi c, и можете ли вы либо реструктурировать свой файл значений, чтобы упростить это, либо использовать что-то вроде оператора Kubernetes, который на более обычном языке и более тестируемый. )

...