I've below json as an input:
{
"data": {
"abc": 123,
"Abc": 345,
"bcd": 789
}
}
I want the result like:
{
"data": {
"abc": "123,345",
"bcd": "789"
}
}
i.e. case insensitive key and the values as list or comma-separated String.
For below code block, it's giving error like
policy.rego:3: eval_conflict_error: object keys must be unique
result := {lower(key): input.data[key] | count(key)>0}
Here's a rego playground link.
I'm really newbie to rego and not able to understand if this can be done. Any help would be really appreciated. Thanks!
This is definitely doable in Rego, but it does require getting comfortable with array comprehensions first!
package stackoverflow.example
result[k] := v {
# Find a value `i`, and assign `k` to be that value lowercased.
some i
input.data[i]
k := lower(i)
# We use an array comprehension to generate a list.
# A separate "some" variable is needed here for the comprehension,
# because `i` has already been assigned a fixed value.
some j
values := [format_int(x, 10) | x := input.data[j]; lower(j) == k]
v := concat(",", values)
}
Interactive Rego Playground link
You can code-golf this down a bit as well, although it's a bit more cluttered:
golfed_version[k] := v {
some i, j
input.data[i]
k := lower(i)
v := concat(",", [format_int(x, 10) | x := input.data[j]; lower(j) == k])
}