Class: Ruby::Rego::Unifier

Inherits:
Object
  • Object
show all
Defined in:
lib/ruby/rego/unifier.rb,
lib/ruby/rego/unifier/helpers.rb,
lib/ruby/rego/unifier/key_candidates.rb,
lib/ruby/rego/unifier/object_matching.rb,
lib/ruby/rego/unifier/reference_resolution.rb

Overview

:reek:DataClump Reference-pattern unification: base resolution, path traversal, and key-candidate enumeration.

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.



17
18
19
# File 'lib/ruby/rego/unifier.rb', line 17

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:



38
39
40
41
42
43
44
# File 'lib/ruby/rego/unifier.rb', line 38

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


25
26
27
28
# File 'lib/ruby/rego/unifier.rb', line 25

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


52
53
54
55
56
57
58
# File 'lib/ruby/rego/unifier.rb', line 52

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


66
67
68
69
70
71
72
73
# File 'lib/ruby/rego/unifier.rb', line 66

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