在jsonnet中使用条件参数导入

时间:2019-07-18 01:22:21

标签: json jsonnet

我希望能够为导入的变量指定不同的参数并更改导入的行为。例如,我想要以下内容:

local foo = import "foo.libsonnet";
{
  "foo1": foo["foo1"], 
  "foo2": foo["foo2"]
}

foo.libsonnet :(类似于具有默认值的程序中的切换情况),我知道以下内容不起作用。只是可能使用伪代码。

{
  "foo1": "bar1", // only if foo1 is passed
  "foo2": "bar2", // only if foo2 is passed

  "bar1" : "bar1_value",//default 
  "bar2" : "bar2_value" //default 
}

输出:

{
"foo1":{
  "foo1": "bar1",
  "bar1": "bar1_value",
  "bar2" : "bar2_value"
  },
"foo2":{
  "foo2": "bar2",
  "bar1": "bar1_value",
  "bar2" : "bar2_value"
  }
}

2 个答案:

答案 0 :(得分:0)

只需将foo.libsonnet做成“成熟的”对象(通常在实践中会做),还请注意,原始foo.jsonnet并不是有效的构造(使用大括号作为{{1} }(类似于列表中的{}):

[]

注意:此答案试图解决原始问题,更新后会偏离主题。

答案 1 :(得分:0)

可能的实现,使用实现“查询”逻辑的get()方法返回对象:

$ cat foo.jsonnet 
local foo = import "foo.libsonnet";
{
  foo1: foo.get("foo1"),
  foo2: foo.get("foo2"),
  foo3: foo.get("foo3"),
}

$ cat foo.libsonnet 
local data = {
  param_q:: {
    foo1: "bar1",
    foo2: "bar2",
  },
  const:: {
    bar1: "bar1_value",
    bar2: "bar2_value",
  },
};
// Object with get() method to implement parametrized data return
{
  get(q):: (
    // const data
    data.const +
    // parametrized data (if-then-else to support q not in param_q)
    if q in data.param_q then { [q]: data.param_q[q] } else {}
  ),
}

$ jsonnet foo.jsonnet 
{
   "foo1": {
      "bar1": "bar1_value",
      "bar2": "bar2_value",
      "foo1": "bar1"
   },
   "foo2": {
      "bar1": "bar1_value",
      "bar2": "bar2_value",
      "foo2": "bar2"
   },
   "foo3": {
      "bar1": "bar1_value",
      "bar2": "bar2_value"
   }
}