Class: Ruby::Rego::Unifier
- Inherits:
-
Object
- Object
- Ruby::Rego::Unifier
- 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
-
#initialize(variable_resolver: nil) ⇒ Unifier
constructor
A new instance of Unifier.
-
#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.
-
#unify(pattern, value, env) ⇒ Array<Hash{String => Value}>
-
#unify_array(pattern_elems, value_array, env, bindings = {}) ⇒ Array<Hash{String => Value}>
:reek:LongParameterList.
-
#unify_object(pattern_pairs, value_obj, env, bindings = {}) ⇒ Array<Hash{String => Value}>
:reek:LongParameterList.
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
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}>
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
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
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 |