0

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

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

2 回答 2

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"
   }
}
于 2019-07-21T16:09:11.967 回答
0

注意:以下答案试图解决原始问题,在更新(并改写)后偏离主题

只需要制作foo.libsonnet一个“成熟”的对象(通常在实践中完成),还要注意你的原始foo.jsonnet不是一个有效的构造(使用大括号作为{}类似于列表的东西[]):

$ cat foo.jsonnet 
local foo = import "foo.libsonnet";
[ foo["foo1"], foo["foo2"] ]

$ cat foo.libsonnet 
{
  foo1: "bar1",
  foo2: "bar2",
}

$ jsonnet foo.jsonnet 
[
   "bar1",
   "bar2"
]
于 2019-07-18T11:32:29.183 回答