Hands-On with OPA — 2 : Merging Objects
1 min readMar 23, 2023
Try it out here at https://play.openpolicyagent.org/p/6ZsiOVpApv
# Merge two objects without overriding values
# ----------------------------------------
#
# This example defines how to merge two objects
package app.merge
import future.keywords.in
example {
x = {"a":[true], "b":["foo"], "c":[4]}
y = {"b":["bar"], "d":["du"], "c":[100]}
merge_arrays(x,y) == {"a": [true],"b": ["bar","foo"],"c": [100,4],"d": ["du"]}
}
has_key(x, k) { _ = x[k] }
merge_values(k, a, b) = a[k]{
not has_key(b, k)
}
merge_values(k, a, b) = b[k]{
not has_key(a, k)
}
merge_values(k, a, b) = c{
has_key(a, k)
has_key(b, k)
c := array.concat(a[k],b[k])
}
merge_arrays(a, b) = c {
ks := {k | some k; _ = a[k]} | {k | some k; _ = b[k]}
c := {k: v | some k; ks[k]; v := merge_values(k, b, a)}
}
This is a modified version of code at https://www.openpolicyagent.org/docs/v0.17.3/policy-cheatsheet/#patterns, getting rid of overriding values. Look forward for availability of more such patterns.