【问题标题】:import with conditional argument in jsonnet在 jsonnet 中使用条件参数导入
【发布时间】:2019-07-18 01:22:21
【问题描述】:

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

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

【问题讨论】:

    标签: json jsonnet


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      只需要使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"
      ]
      

      【讨论】:

      • 我认为我没有正确解释。我刚刚更新了这个问题。你能看一下吗?谢谢
      • @ali-n 当然,看看第二次拍摄,问候--jjo
      猜你喜欢
      • 1970-01-01
      • 2022-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-05
      • 1970-01-01
      • 2021-02-08
      • 2018-10-27
      相关资源
      最近更新 更多