Class: Ruby::Rego::Evaluator::ReferenceResolver
- Inherits:
-
Object
- Object
- Ruby::Rego::Evaluator::ReferenceResolver
- Defined in:
- lib/ruby/rego/evaluator/reference_resolver.rb,
lib/ruby/rego/evaluator/reference_resolver/caching.rb,
lib/ruby/rego/evaluator/reference_resolver/imports.rb,
lib/ruby/rego/evaluator/reference_resolver/path_resolution.rb,
lib/ruby/rego/evaluator/reference_resolver/static_key_builder.rb
Overview
Static reference-key construction.
Defined Under Namespace
Classes: StaticKeyBuilder
Constant Summary collapse
- UNCACHEABLE =
Object.new.freeze
Instance Method Summary collapse
-
#attach_module_resolver(module_resolver) ⇒ void
Attach the cross-package module registry.
-
#function_reference_name(reference) ⇒ String?
Resolve a function call reference to a rule name when possible.
-
#function_reference_target(reference) ⇒ Object
:reek:FeatureEnvy.
-
#initialize(environment:, package_path:, rule_value_provider:, imports: [], memoization: nil) ⇒ ReferenceResolver
constructor
A new instance of ReferenceResolver.
-
#resolve(ref) ⇒ Value
-
#resolve_function_reference_name(reference) ⇒ Object
:reek:FeatureEnvy.
-
#resolve_import_variable(name) ⇒ Value?
Resolve an import alias used as a bare variable.
-
#resolve_rule_variable(name) ⇒ Value?
Resolve a rule name used as a bare variable.
Constructor Details
#initialize(environment:, package_path:, rule_value_provider:, imports: [], memoization: nil) ⇒ ReferenceResolver
Returns a new instance of ReferenceResolver.
14 15 16 17 18 19 20 21 22 23 24 25 |
# File 'lib/ruby/rego/evaluator/reference_resolver.rb', line 14 def initialize(environment:, package_path:, rule_value_provider:, imports: [], memoization: nil) @environment = environment @package_path = package_path @rule_value_provider = rule_value_provider @memoization = memoization @key_resolver = ReferenceKeyResolver.new( environment: environment, variable_resolver: method(:resolve_variable_key) ) @import_map = build_import_map(imports) @module_resolver = nil end |
Instance Method Details
#attach_module_resolver(module_resolver) ⇒ void
This method returns an undefined value.
Attach the cross-package module registry.
31 32 33 |
# File 'lib/ruby/rego/evaluator/reference_resolver.rb', line 31 def attach_module_resolver(module_resolver) @module_resolver = module_resolver end |
#function_reference_name(reference) ⇒ String?
Resolve a function call reference to a rule name when possible.
77 78 79 80 81 82 83 84 |
# File 'lib/ruby/rego/evaluator/reference_resolver.rb', line 77 def function_reference_name(reference) return nil unless reference.is_a?(AST::Reference) target = function_reference_target(reference) return nil unless target resolve_function_reference_name(target) end |
#function_reference_target(reference) ⇒ Object
:reek:FeatureEnvy
87 88 89 90 91 92 93 94 95 96 |
# File 'lib/ruby/rego/evaluator/reference_resolver.rb', line 87 def function_reference_target(reference) import_reference = import_reference_for(reference) return reference unless import_reference AST::Reference.new( base: import_reference.base, path: import_reference.path + reference.path, location: reference.location ) end |
#resolve(ref) ⇒ Value
37 38 39 40 41 42 43 44 45 46 |
# File 'lib/ruby/rego/evaluator/reference_resolver.rb', line 37 def resolve(ref) return environment.resolve_reference(ref) unless ref.is_a?(AST::Reference) cached = cached_reference_value(ref) return cached if cached value = resolve_reference_value(ref) cache_reference_value(ref, value) if cacheable_reference?(ref) value end |
#resolve_function_reference_name(reference) ⇒ Object
:reek:FeatureEnvy
99 100 101 102 103 104 105 106 |
# File 'lib/ruby/rego/evaluator/reference_resolver.rb', line 99 def resolve_function_reference_name(reference) base = reference.base return nil unless base.is_a?(AST::Variable) && base.name == "data" rule_reference(reference.path)&.then do |(rule_name, remaining_path)| remaining_path.empty? ? rule_name : nil end end |
#resolve_import_variable(name) ⇒ Value?
Resolve an import alias used as a bare variable.
52 53 54 55 56 57 58 59 |
# File 'lib/ruby/rego/evaluator/reference_resolver.rb', line 52 def resolve_import_variable(name) reference = import_map[name.to_s] return nil unless reference return nil if environment.local_bound?(name) return nil unless environment.lookup(name).is_a?(UndefinedValue) resolve(reference) end |
#resolve_rule_variable(name) ⇒ Value?
Resolve a rule name used as a bare variable.
65 66 67 68 69 70 71 |
# File 'lib/ruby/rego/evaluator/reference_resolver.rb', line 65 def resolve_rule_variable(name) return nil if environment.local_bound?(name) return nil unless environment.lookup(name).is_a?(UndefinedValue) return nil unless rule_value_provider.rule_defined?(name) rule_or_override_value(name) end |