Rego object.get с многоуровневым ключом

Есть ли способ использовать object.get с многоуровневым ключом..?

Мой ввод выглядит так:{ "pipelineParameters" : { "k8" : { "NODES" : "1" }, "ec2": { "NODES" : "0" } }

мои данные выглядят как { "key": "pipelineParameters.k8.NODES" }

Как получить значение из ввода на основе многоуровневого ключа

Образец кода

https://play.openpolicyagent.org/p/iR15XnMctP

1 ответ

Решение

В object.getфункция не поддерживает многоуровневые клавиши. Вы можете использовать walk для этого, если вы представляете ключ в виде массива:

input = {
    "pipelineParameters" : {
        "k8" : {
            "NODES" : "1"
        },
        "ec2": {
           "NODES" : "0"
        }
    }
}

Например:

> walk(input, [["pipelineParameters", "k8", "NODES"], "1"])
true
> walk(input, [["pipelineParameters", "k8",  "NODES"], x])
+-----+
|  x  |
+-----+
| "1" |
+-----+
> walk(input, [["pipelineParameters", y,  "NODES"], x])
+-----+-------+
|  x  |   y   |
+-----+-------+
| "1" | "k8"  |
| "0" | "ec2" |
+-----+-------+

Чтобы преобразовать ваш ключ в массив, вы можете просто написать:

split(key, ".")

Например:

split("pipelineParameters.k8.NODES", ".")
[
  "pipelineParameters",
  "k8",
  "NODES"
]

Собираем все вместе:

> walk(input, [split("pipelineParameters.k8.NODES", "."), x])
+-----+
|  x  |
+-----+
| "1" |
+-----+
Другие вопросы по тегам