Class: Ruby::Rego::Builtins::BuiltinRegistry

Inherits:
Object
  • Object
show all
Includes:
BuiltinInvocation
Defined in:
lib/ruby/rego/builtins/registry.rb

Overview

Registry for built-in function implementations.

Defined Under Namespace

Classes: Entry

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeBuiltinRegistry

Returns a new instance of BuiltinRegistry.



60
61
62
# File 'lib/ruby/rego/builtins/registry.rb', line 60

def initialize
  @builtins = {}
end

Class Method Details

.instanceBuiltinRegistry

Returns:



54
55
56
# File 'lib/ruby/rego/builtins/registry.rb', line 54

def self.instance
  @instance ||= new
end

Instance Method Details

#call(name, args) ⇒ Ruby::Rego::Value

Parameters:

  • name (String, Symbol)
  • args (Array<Object>)

Returns:



81
82
83
84
# File 'lib/ruby/rego/builtins/registry.rb', line 81

def call(name, args)
  entry = fetch_entry(normalize_name(name))
  invoke_entry(entry, args)
end

#entry_for(name) ⇒ Entry

Parameters:

  • name (String, Symbol)

Returns:



88
89
90
# File 'lib/ruby/rego/builtins/registry.rb', line 88

def entry_for(name)
  fetch_entry(normalize_name(name))
end

#register(name, arity) {|args| ... } ⇒ void

This method returns an undefined value.

Parameters:

  • name (String, Symbol)
  • arity (Integer)

Yield Parameters:

Raises:

  • (ArgumentError)


68
69
70
71
72
73
74
75
76
# File 'lib/ruby/rego/builtins/registry.rb', line 68

def register(name, arity, &block)
  raise ArgumentError, "Builtin registration requires a block" unless block

  builtin_name = normalize_name(name)
  validate_arity(arity)
  raise ArgumentError, "Builtin already registered: #{builtin_name}" if @builtins.key?(builtin_name)

  @builtins[builtin_name] = Entry.new(name: builtin_name, arity: arity, handler: block)
end

#registered?(name) ⇒ Boolean

Parameters:

  • name (String, Symbol)

Returns:

  • (Boolean)


117
118
119
# File 'lib/ruby/rego/builtins/registry.rb', line 117

def registered?(name)
  @builtins.key?(normalize_name(name))
end

#with_entry_override(name, entry) ⇒ Object

Parameters:

  • name (String, Symbol)
  • entry (Entry)

Yield Returns:

  • (Object)

Returns:

  • (Object)


96
97
98
99
100
101
102
103
# File 'lib/ruby/rego/builtins/registry.rb', line 96

def with_entry_override(name, entry)
  builtin_name = normalize_name(name)
  previous = fetch_entry(builtin_name)
  @builtins[builtin_name] = entry
  yield
ensure
  @builtins[builtin_name] = previous
end

#with_override(name, entry) ⇒ BuiltinRegistryOverlay

Parameters:

  • name (String, Symbol)
  • entry (Entry)

Returns:



108
109
110
111
112
113
# File 'lib/ruby/rego/builtins/registry.rb', line 108

def with_override(name, entry)
  BuiltinRegistryOverlay.new(
    base_registry: self,
    overrides: { normalize_name(name) => entry }
  )
end