Module: Ruby::Rego::Builtins::Collections::ObjectOps
- Defined in:
- lib/ruby/rego/builtins/collections/object_ops.rb
Overview
Object-focused collection helpers.
Class Method Summary collapse
-
.object_filter(object, keys) ⇒ Ruby::Rego::ObjectValue
-
.object_get(object, key, default) ⇒ Ruby::Rego::Value
-
.object_keys(object) ⇒ Ruby::Rego::SetValue
-
.object_remove(object, keys) ⇒ Ruby::Rego::ObjectValue
-
.object_union(left, right) ⇒ Ruby::Rego::ObjectValue
Deep-merges two objects (OPA’s object.union).
-
.object_union_n(array) ⇒ Ruby::Rego::ObjectValue
-
.subset(super_value, sub_value) ⇒ Ruby::Rego::BooleanValue
True when
subis a subset ofsuper, matching OPA’s object.subset. -
.union_objects(left, right) ⇒ Ruby::Rego::ObjectValue
Backs the polymorphic
unionbuiltin for two objects: a strict shallow merge that RAISES on a conflicting key.
Class Method Details
.object_filter(object, keys) ⇒ Ruby::Rego::ObjectValue
175 176 177 178 179 |
# File 'lib/ruby/rego/builtins/collections/object_ops.rb', line 175 def self.object_filter(object, keys) obj = object_value(object, name: "object.filter object") keep = key_collection(keys, name: "object.filter keys") ObjectValue.new(obj.value.select { |key, _value| keep.include?(normalize_object_key(key)) }) end |
.object_get(object, key, default) ⇒ Ruby::Rego::Value
18 19 20 21 22 23 |
# File 'lib/ruby/rego/builtins/collections/object_ops.rb', line 18 def self.object_get(object, key, default) obj = object_value(object, name: "object.get object") key_value = normalize_object_key(Base.to_ruby(key)) value = obj.fetch_reference(key_value) value.is_a?(UndefinedValue) ? default : value end |
.object_keys(object) ⇒ Ruby::Rego::SetValue
130 131 132 133 |
# File 'lib/ruby/rego/builtins/collections/object_ops.rb', line 130 def self.object_keys(object) obj = object_value(object, name: "object.keys") SetValue.new(obj.value.keys) end |
.object_remove(object, keys) ⇒ Ruby::Rego::ObjectValue
138 139 140 141 142 143 |
# File 'lib/ruby/rego/builtins/collections/object_ops.rb', line 138 def self.object_remove(object, keys) obj = object_value(object, name: "object.remove object") remove_keys = key_collection(keys, name: "object.remove keys") filtered = obj.value.reject { |key, _value| remove_keys.include?(normalize_object_key(key)) } ObjectValue.new(filtered) end |
.object_union(left, right) ⇒ Ruby::Rego::ObjectValue
Deep-merges two objects (OPA’s object.union). Nested objects merge recursively; a differing- value or type-mismatch conflict takes the second operand’s value, but a numerically-equal conflict keeps the first operand (so a tie preserves the left spelling, matching OPA).
152 153 154 155 156 157 158 159 |
# File 'lib/ruby/rego/builtins/collections/object_ops.rb', line 152 def self.object_union(left, right) merged = deep_union( object_value(left, name: "object.union").value, object_value(right, name: "object.union").value, prefer_left_on_tie: true ) ObjectValue.new(merged) end |
.object_union_n(array) ⇒ Ruby::Rego::ObjectValue
163 164 165 166 167 168 169 170 |
# File 'lib/ruby/rego/builtins/collections/object_ops.rb', line 163 def self.object_union_n(array) Base.assert_type(array, expected: ArrayValue, context: "object.union_n") seed = {} # @type var seed: Hash[untyped, Value] merged = array.value.reduce(seed) do |acc, element| deep_union(acc, object_value(element, name: "object.union_n element").value, prefer_left_on_tie: false) end ObjectValue.new(merged) end |
.subset(super_value, sub_value) ⇒ Ruby::Rego::BooleanValue
True when sub is a subset of super, matching OPA’s object.subset. Valid operand
pairs: object/object (recursive), set/set, array/array (a contiguous subslice), and
array/set (super array contains the set’s members). Any other pairing is undefined.
31 32 33 |
# File 'lib/ruby/rego/builtins/collections/object_ops.rb', line 31 def self.subset(super_value, sub_value) BooleanValue.new(subset?(super_value.to_ruby, sub_value.to_ruby)) end |
.union_objects(left, right) ⇒ Ruby::Rego::ObjectValue
Backs the polymorphic union builtin for two objects: a strict shallow
merge that RAISES on a conflicting key. Distinct from object_union
above (OPA’s object.union), which is a deep merge where the right wins.
188 189 190 191 192 |
# File 'lib/ruby/rego/builtins/collections/object_ops.rb', line 188 def self.union_objects(left, right) left_obj = object_value(left, name: "union left").value right_obj = object_value(right, name: "union right").value ObjectValue.new(merge_objects(left_obj, right_obj)) end |