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

Class Method Details

.object_filter(object, keys) ⇒ Ruby::Rego::ObjectValue

Parameters:

Returns:



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

Parameters:

Returns:



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

Parameters:

Returns:



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

Parameters:

Returns:



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).

Parameters:

Returns:



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

Parameters:

Returns:



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.

Parameters:

Returns:



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.

Parameters:

Returns:



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