Class: Ruby::Rego::Unifier

Inherits:
Object
  • Object
show all
Defined in:
lib/ruby/rego/unifier.rb

Overview

Handles pattern matching and unification for Rego terms. :reek:DataClump rubocop:disable Metrics/ClassLength

Defined Under Namespace

Modules: Helpers Classes: ObjectBindingState, ReferenceKeyContext

Instance Method Summary collapse

Constructor Details

#initialize(variable_resolver: nil) ⇒ Unifier

Returns a new instance of Unifier.



161
162
163
# File 'lib/ruby/rego/unifier.rb', line 161

def initialize(variable_resolver: nil)
  @variable_resolver = variable_resolver
end

Instance Method Details

#reference_bindings(reference, env, bindings = {}, base_value: nil, variable_resolver: nil) ⇒ Array<Array(Hash{String => Value}, Value)>

Resolve reference bindings for references with variable keys.

:reek:LongParameterList

Parameters:

Returns:



182
183
184
185
186
187
188
# File 'lib/ruby/rego/unifier.rb', line 182

def reference_bindings(reference, env, bindings = {}, base_value: nil, variable_resolver: nil)
  base_value ||= resolve_reference_base(reference.base, env, bindings)
  return [] if base_value.is_a?(UndefinedValue)

  resolver = variable_resolver || @variable_resolver
  traverse_reference(base_value, reference.path, env, bindings, variable_resolver: resolver)
end

#unify(pattern, value, env) ⇒ Array<Hash{String => Value}>

Parameters:

Returns:

  • (Array<Hash{String => Value}>)


169
170
171
172
# File 'lib/ruby/rego/unifier.rb', line 169

def unify(pattern, value, env)
  bindings = {} # @type var bindings: Hash[String, Value]
  unify_with_bindings(pattern, value, env, bindings)
end

#unify_array(pattern_elems, value_array, env, bindings = {}) ⇒ Array<Hash{String => Value}>

:reek:LongParameterList

Parameters:

Returns:

  • (Array<Hash{String => Value}>)


196
197
198
199
200
201
202
# File 'lib/ruby/rego/unifier.rb', line 196

def unify_array(pattern_elems, value_array, env, bindings = {})
  pattern_elements = pattern_elems.is_a?(AST::ArrayLiteral) ? pattern_elems.elements : pattern_elems
  elements = Helpers.normalize_array(value_array)
  return [] unless elements && elements.length == pattern_elements.length

  reduce_array_bindings(pattern_elements, elements, env, bindings)
end

#unify_object(pattern_pairs, value_obj, env, bindings = {}) ⇒ Array<Hash{String => Value}>

:reek:LongParameterList

Parameters:

Returns:

  • (Array<Hash{String => Value}>)


210
211
212
213
214
215
216
217
# File 'lib/ruby/rego/unifier.rb', line 210

def unify_object(pattern_pairs, value_obj, env, bindings = {})
  pairs = pattern_pairs.is_a?(AST::ObjectLiteral) ? pattern_pairs.pairs : pattern_pairs
  object_values = Helpers.normalize_object(value_obj)
  return [] unless object_values
  return [] unless pairs.length == object_values.length

  reduce_object_pairs(pairs, object_values, env, bindings).map(&:bindings)
end