首页 > 解决方案 > 在 jsonnet 中使用条件参数导入

问题描述

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

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

foo.libsonnet:(类似于编程中具有默认值的 switch case)我知道以下内容不应该工作。只是可能使用它的伪代码。

{
  "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"
  }
}

标签: jsonjsonnet

解决方案


一个可能的实现,返回一个带有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"
   }
}

推荐阅读