Как переопределить «я» в Jsonnet? - PullRequest
0 голосов
/ 10 июля 2019

Я пытаюсь создать шаблон, который имеет некоторые значения по умолчанию, но они должны быть переопределены, если предоставляется файл пользовательских значений.Проблема в том, что некоторые из моих переменных в объекте построены из других переменных в том же объекте, например adjective: 'Good' + self.fruit.Это не переопределяется.

std.mergePatch не дает ожидаемого результата, потому что рендерит весь объект (который уже сделал нас из self.fruit к настоящему времени), а затем переопределяет fruit.

local myobj = { 
  adjective: 'Good ' + self.fruit.name, 
  fruit: {
    name: 'apple', 
    qty: 1
  },
};
myobj

дает правильный результат, когда ничего не переопределяется:

{
  "adjective": "Good apple",
  "fruit": {
    "name": "apple",
    "qty": 1
  }
}

Но когда я пытаюсь переопределить его с другой переменной, он все равно принимает значение по умолчанию, если я использую std.mergePatch следующим образом:

local config = {
  fruit: {
    name: 'banana',
    size: 'large',
  },
};

local myobj = { 
  adjective: 'Good ' + self.fruit.name, 
  fruit: {
    name: 'apple', 
    qty: 1
  },
};

std.mergePatch(myobj, config)

Производит (обратите внимание на неправильное название фрукта в adjective):

{
  "adjective": "Good apple",
  "fruit": {
    "name": "banana",
    "qty": 1,
    "size": "large"
  }
}

И если я непосредственно добавлю два объекта, он пропустит дополнительную информацию:

local config = {
  fruit: {
    name: 'banana',
    size: 'large',
  },
};

local myobj = { 
  adjective: 'Good ' + self.fruit.name, 
  fruit: {
    name: 'apple', 
    qty: 1
  },
};

myobj + config

Производит (обратите внимание на отсутствующее значение по умолчанию qty: 1):

{
  "adjective": "Good banana",
  "fruit": {
    "name": "banana",
    "size": "large"
  }
}

Как этого добиться с помощью Jsonnet?

1 Ответ

1 голос
/ 10 июля 2019

std.mergePatch() объединит эти уже "завершенные" объекты, поэтому переопределение полей self будет невозможно.

Для добавления двух объектов просто требуется +:, чтобы иметь возможность наследовать от родительского объекта.поле:

jsonnet-stackoverflow-56971012.jsonnet источник:

local config = {
  fruit+: {
    name: 'banana',
    size: 'large',
  },
};

local myobj = {
  adjective: 'Good ' + self.fruit.name,
  fruit+: {
    name: 'apple',
    qty: 1
  },
};

myobj + config

jsonnet-stackoverflow-56971012.jsonnet вывод:

{
   "adjective": "Good banana",
   "fruit": {
      "name": "banana",
      "qty": 1,
      "size": "large"
   }
}

Обратите внимание, что + не требуется для myobj, хотя IMO было бы неплохо сохранить его там на тот случай, если вам понадобится переопределить (будущий) базовый объект.

...