Module: Ruby::Rego

Defined in:
lib/ruby/rego.rb,
lib/ruby/rego/lexer.rb,
lib/ruby/rego/token.rb,
lib/ruby/rego/value.rb,
lib/ruby/rego/errors.rb,
lib/ruby/rego/parser.rb,
lib/ruby/rego/policy.rb,
lib/ruby/rego/result.rb,
lib/ruby/rego/unifier.rb,
lib/ruby/rego/version.rb,
lib/ruby/rego/ast/base.rb,
lib/ruby/rego/ast/call.rb,
lib/ruby/rego/ast/rule.rb,
lib/ruby/rego/compiler.rb,
lib/ruby/rego/location.rb,
lib/ruby/rego/ast/every.rb,
lib/ruby/rego/ast/query.rb,
lib/ruby/rego/call_name.rb,
lib/ruby/rego/evaluator.rb,
lib/ruby/rego/ast/import.rb,
lib/ruby/rego/ast/module.rb,
lib/ruby/rego/ast/literal.rb,
lib/ruby/rego/ast/package.rb,
lib/ruby/rego/environment.rb,
lib/ruby/rego/memoization.rb,
lib/ruby/rego/ast/unary_op.rb,
lib/ruby/rego/ast/variable.rb,
lib/ruby/rego/lexer/stream.rb,
lib/ruby/rego/parser/query.rb,
lib/ruby/rego/parser/rules.rb,
lib/ruby/rego/ast/binary_op.rb,
lib/ruby/rego/ast/composite.rb,
lib/ruby/rego/ast/reference.rb,
lib/ruby/rego/builtins/base.rb,
lib/ruby/rego/error_payload.rb,
lib/ruby/rego/builtins/types.rb,
lib/ruby/rego/error_handling.rb,
lib/ruby/rego/compiled_module.rb,
lib/ruby/rego/builtins/strings.rb,
lib/ruby/rego/environment_pool.rb,
lib/ruby/rego/ast/comprehension.rb,
lib/ruby/rego/builtins/registry.rb,
lib/ruby/rego/parser/precedence.rb,
lib/ruby/rego/parser/references.rb,
lib/ruby/rego/parser/collections.rb,
lib/ruby/rego/parser/expressions.rb,
lib/ruby/rego/builtins/aggregates.rb,
lib/ruby/rego/lexer/number_reader.rb,
lib/ruby/rego/lexer/string_reader.rb,
lib/ruby/rego/builtins/collections.rb,
lib/ruby/rego/builtins/comparisons.rb,
lib/ruby/rego/builtins/strings/trim.rb,
lib/ruby/rego/environment/overrides.rb,
lib/ruby/rego/builtins/strings/split.rb,
lib/ruby/rego/builtins/strings/concat.rb,
lib/ruby/rego/builtins/strings/search.rb,
lib/ruby/rego/builtins/numeric_helpers.rb,
lib/ruby/rego/builtins/strings/helpers.rb,
lib/ruby/rego/evaluator/rule_evaluator.rb,
lib/ruby/rego/builtins/registry_helpers.rb,
lib/ruby/rego/builtins/strings/case_ops.rb,
lib/ruby/rego/evaluator/binding_helpers.rb,
lib/ruby/rego/builtins/comparisons/casts.rb,
lib/ruby/rego/builtins/strings/substring.rb,
lib/ruby/rego/builtins/strings/formatting.rb,
lib/ruby/rego/builtins/collections/set_ops.rb,
lib/ruby/rego/evaluator/assignment_support.rb,
lib/ruby/rego/evaluator/operator_evaluator.rb,
lib/ruby/rego/evaluator/query_node_builder.rb,
lib/ruby/rego/evaluator/reference_resolver.rb,
lib/ruby/rego/evaluator/variable_collector.rb,
lib/ruby/rego/lexer/template_string_reader.rb,
lib/ruby/rego/with_modifiers/with_modifier.rb,
lib/ruby/rego/builtins/strings/trim_helpers.rb,
lib/ruby/rego/evaluator/expression_dispatch.rb,
lib/ruby/rego/evaluator/rule_value_provider.rb,
lib/ruby/rego/builtins/collections/array_ops.rb,
lib/ruby/rego/evaluator/expression_evaluator.rb,
lib/ruby/rego/builtins/collections/object_ops.rb,
lib/ruby/rego/builtins/strings/number_helpers.rb,
lib/ruby/rego/environment/reference_resolution.rb,
lib/ruby/rego/evaluator/reference_key_resolver.rb,
lib/ruby/rego/evaluator/comprehension_evaluator.rb,
lib/ruby/rego/evaluator/rule_evaluator/bindings.rb,
lib/ruby/rego/evaluator/object_literal_evaluator.rb,
lib/ruby/rego/with_modifiers/with_modifier_applier.rb,
lib/ruby/rego/with_modifiers/with_modifier_context.rb,
lib/ruby/rego/with_modifiers/with_modifier_root_scope.rb,
lib/ruby/rego/with_modifiers/with_modifier_path_override.rb,
lib/ruby/rego/with_modifiers/with_modifier_builtin_override.rb,
lib/ruby/rego/with_modifiers/with_modifier_path_key_resolver.rb

Overview

Ruby Rego implementation namespace.

Defined Under Namespace

Modules: AST, Builtins, CallName, DefaultRuleCallName, EnvironmentOverrides, EnvironmentReferenceResolution, ErrorPayload, Memoization, TokenType, WithModifiers Classes: ArrayValue, BooleanValue, BuiltinArgumentError, CompilationError, CompiledModule, Compiler, DefaultRuleValidator, Environment, EnvironmentPool, Error, EvaluationError, Evaluator, Lexer, LexerError, Location, NullValue, NumberValue, ObjectKeyConflictError, ObjectValue, Parser, ParserError, Policy, Result, ResultBuilder, SetValue, StringValue, Token, TypeError, UndefinedValue, UnificationError, Unifier, Value

Constant Summary collapse

VERSION =
"0.1.0"
DEFAULT_RULE_CHILD_NODE_EXTRACTORS =
{
  AST::BinaryOp => ->(node) { [node.left, node.right] },
  AST::UnaryOp => ->(node) { [node.operand] },
  AST::ArrayLiteral => :elements.to_proc,
  AST::SetLiteral => :elements.to_proc,
  AST::ObjectLiteral => lambda do |node|
    node.pairs.flat_map { |key_node, value_node| [key_node, value_node] }
  end,
  AST::ArrayComprehension => lambda do |node|
    term = node.term
    body = Array(node.body)
    [term] + body
  end,
  AST::SetComprehension => lambda do |node|
    term = node.term
    body = Array(node.body)
    [term] + body
  end,
  AST::ObjectComprehension => lambda do |node|
    key_node, value_node = node.term
    body = Array(node.body)
    [key_node, value_node] + body
  end,
  AST::Call => ->(node) { [node.name] + node.args },
  AST::QueryLiteral => ->(node) { [node.expression] + node.with_modifiers },
  AST::Every => lambda do |node|
    body = Array(node.body)
    [node.key_var, node.value_var, node.domain] + body
  end,
  AST::SomeDecl => ->(node) { node.variables + Array(node.collection) },
  AST::WithModifier => ->(node) { [node.target, node.value] },
  AST::TemplateString => :parts.to_proc
}.freeze

Class Method Summary collapse

Class Method Details

.compile(source) ⇒ CompiledModule

Compile Rego source into an immutable compiled module.

Parameters:

  • source (String)

    Rego source code

Returns:



50
51
52
53
54
# File 'lib/ruby/rego.rb', line 50

def compile(source)
  ErrorHandling.wrap("compilation") do
    Compiler.new.compile(parse(source))
  end
end

.evaluate(source, input: {}, data: {}, query: nil) ⇒ Result?

Evaluate Rego source against input and data.

:reek:LongParameterList

Parameters:

  • source (String)

    Rego source code

  • input (Object) (defaults to: {})

    input document

  • data (Object) (defaults to: {})

    data document

  • query (Object, nil) (defaults to: nil)

    optional query path

Returns:

  • (Result, nil)

    evaluation result, or nil when a query is undefined



64
65
66
67
68
69
# File 'lib/ruby/rego.rb', line 64

def evaluate(source, input: {}, data: {}, query: nil)
  compiled_module = compile(source)
  ErrorHandling.wrap("evaluation") do
    Evaluator.new(compiled_module, input: input, data: data).evaluate(query)
  end
end

.parse(source) ⇒ AST::Module

Parse Rego source into an AST module.

Parameters:

  • source (String)

    Rego source code

Returns:



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

def parse(source)
  ErrorHandling.wrap("parsing") do
    tokens = Lexer.new(source).tokenize
    Parser.new(tokens).parse
  end
end