Module: Ruby::Rego::Builtins::Collections

Extended by:
RegistryHelpers
Defined in:
lib/ruby/rego/builtins/collections.rb,
lib/ruby/rego/builtins/collections/set_ops.rb,
lib/ruby/rego/builtins/collections/array_ops.rb,
lib/ruby/rego/builtins/collections/object_ops.rb

Overview

Built-in collection helpers.

Defined Under Namespace

Modules: ArrayOps, ObjectOps, SetOps

Constant Summary collapse

MISSING_SET_ARGUMENT =
Object.new.freeze
COLLECTION_FUNCTIONS =
{
  "set" => { arity: [0, 1], handler: :set },
  "sort" => { arity: 1, handler: :sort },
  "array.reverse" => { arity: 1, handler: :array_reverse },
  "array.concat" => { arity: 2, handler: :array_concat },
  "array.slice" => { arity: 3, handler: :array_slice },
  "object.get" => { arity: 3, handler: :object_get },
  "object.keys" => { arity: 1, handler: :object_keys },
  "object.remove" => { arity: 2, handler: :object_remove },
  "union" => { arity: 2, handler: :union },
  "intersection" => { arity: 2, handler: :intersection },
  "set_diff" => { arity: 2, handler: :set_diff }
}.freeze

Class Method Summary collapse

Methods included from RegistryHelpers

register_configured_functions

Class Method Details

.array_concat(left, right) ⇒ Ruby::Rego::ArrayValue

Parameters:

Returns:



66
67
68
# File 'lib/ruby/rego/builtins/collections.rb', line 66

def self.array_concat(left, right)
  ArrayOps.array_concat(left, right)
end

.array_reverse(array) ⇒ Ruby::Rego::ArrayValue

Parameters:

Returns:



80
81
82
# File 'lib/ruby/rego/builtins/collections.rb', line 80

def self.array_reverse(array)
  ArrayOps.reverse(array)
end

.array_slice(array, start, stop) ⇒ Ruby::Rego::ArrayValue

Parameters:

Returns:



74
75
76
# File 'lib/ruby/rego/builtins/collections.rb', line 74

def self.array_slice(array, start, stop)
  ArrayOps.array_slice(array, start, stop)
end

.intersection(left, right) ⇒ Ruby::Rego::SetValue

Parameters:

Returns:



118
119
120
# File 'lib/ruby/rego/builtins/collections.rb', line 118

def self.intersection(left, right)
  SetOps.intersection(left, right)
end

.object_get(object, key, default) ⇒ Ruby::Rego::Value

Parameters:

Returns:



88
89
90
# File 'lib/ruby/rego/builtins/collections.rb', line 88

def self.object_get(object, key, default)
  ObjectOps.object_get(object, key, default)
end

.object_keys(object) ⇒ Ruby::Rego::SetValue

Parameters:

Returns:



94
95
96
# File 'lib/ruby/rego/builtins/collections.rb', line 94

def self.object_keys(object)
  ObjectOps.object_keys(object)
end

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

Parameters:

Returns:



101
102
103
# File 'lib/ruby/rego/builtins/collections.rb', line 101

def self.object_remove(object, keys)
  ObjectOps.object_remove(object, keys)
end

.register!Ruby::Rego::Builtins::BuiltinRegistry



36
37
38
39
40
41
42
# File 'lib/ruby/rego/builtins/collections.rb', line 36

def self.register!
  registry = BuiltinRegistry.instance

  register_configured_functions(registry, COLLECTION_FUNCTIONS)

  registry
end

.set(value = MISSING_SET_ARGUMENT) ⇒ Ruby::Rego::SetValue

Parameters:

Returns:



54
55
56
57
58
59
60
61
# File 'lib/ruby/rego/builtins/collections.rb', line 54

def self.set(value = MISSING_SET_ARGUMENT)
  return SetValue.new([]) if value.equal?(MISSING_SET_ARGUMENT)

  Base.assert_type(value, expected: [ArrayValue, SetValue], context: "set")
  return value if value.is_a?(SetValue)

  SetValue.new(value.value)
end

.set_diff(left, right) ⇒ Ruby::Rego::SetValue

Parameters:

Returns:



125
126
127
# File 'lib/ruby/rego/builtins/collections.rb', line 125

def self.set_diff(left, right)
  SetOps.set_diff(left, right)
end

.sort(array) ⇒ Ruby::Rego::ArrayValue

Parameters:

Returns:



48
49
50
# File 'lib/ruby/rego/builtins/collections.rb', line 48

def self.sort(array)
  ArrayOps.sort(array)
end

.union(left, right) ⇒ Ruby::Rego::Value

Parameters:

Returns:



108
109
110
111
112
113
# File 'lib/ruby/rego/builtins/collections.rb', line 108

def self.union(left, right)
  return SetOps.union_sets(left, right) if left.is_a?(SetValue) && right.is_a?(SetValue)
  return ObjectOps.union_objects(left, right) if left.is_a?(ObjectValue) && right.is_a?(ObjectValue)

  raise_union_type_error(left, right)
end