Class: Textus::Hooks::RpcRegistry
- Inherits:
-
Object
- Object
- Textus::Hooks::RpcRegistry
- 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
- #callable(event, name) ⇒ Object
-
#initialize ⇒ RpcRegistry
constructor
A new instance of RpcRegistry.
-
#invoke(event, name, caps:, **other) ⇒ Object
Invoke a registered callable, injecting ‘caps:` only if the callable declares it (or accepts keyrest).
- #names(event) ⇒ Object
- #register(event, name, &blk) ⇒ Object
Constructor Details
#initialize ⇒ RpcRegistry
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
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 |