Class: Textus::Hooks::RpcRegistry

Inherits:
Object
  • Object
show all
Defined in:
lib/textus/hooks/rpc_registry.rb

Constant Summary collapse

EVENTS =
{
  resolve_intake: %i[caps config args],
  transform_rows: %i[caps rows config],
  validate: %i[caps],
}.freeze
PUBSUB_EVENTS =
EventBus::EVENTS.keys.freeze

Instance Method Summary collapse

Constructor Details

#initializeRpcRegistry

Returns a new instance of RpcRegistry.



14
15
16
# File 'lib/textus/hooks/rpc_registry.rb', line 14

def initialize
  @table = Hash.new { |h, k| h[k] = {} }
end

Instance Method Details

#callable(event, name) ⇒ Object



35
36
37
# File 'lib/textus/hooks/rpc_registry.rb', line 35

def callable(event, name)
  @table[event.to_sym][name.to_sym] or raise UsageError.new("unknown #{event}: #{name}")
end

#invoke(event, name, caps:, **other) ⇒ Object

Invoke a registered callable, injecting ‘caps:` only if the callable declares it (or accepts keyrest). Mis-named kwargs (e.g. the legacy `caps:`-alternative) are rejected at registration time, not here.



42
43
44
45
46
47
48
# File 'lib/textus/hooks/rpc_registry.rb', line 42

def invoke(event, name, caps:, **other)
  blk = callable(event, name)
  sig = Signature.new(blk)
  kwargs = other.dup
  kwargs[:caps] = caps if sig.accepts_keyrest? || sig.declared_keys.include?(:caps)
  blk.call(**kwargs)
end

#names(event) ⇒ Object



33
# File 'lib/textus/hooks/rpc_registry.rb', line 33

def names(event) = @table[event.to_sym].keys

#register(event, name, &blk) ⇒ Object

Raises:



18
19
20
21
22
23
24
25
26
27
28
29
30
31
# File 'lib/textus/hooks/rpc_registry.rb', line 18

def register(event, name, &blk)
  event_sym = event.to_sym
  raise UsageError.new("#{event_sym} is a pubsub event; register on EventBus") if PUBSUB_EVENTS.include?(event_sym)

  required = EVENTS[event_sym] or raise UsageError.new("unknown RPC event: #{event}")
  sig = Signature.new(blk)
  missing = sig.missing(required)
  raise UsageError.new("#{event_sym} RPC must accept kwargs: #{required.join(", ")} (missing: #{missing.join(", ")})") if missing.any?

  name = name.to_sym
  raise UsageError.new("#{event_sym} '#{name}' already registered") if @table[event_sym].key?(name)

  @table[event_sym][name] = blk
end