forked from umbrellio/rabbit_messaging
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathhandler_resolver.rb
40 lines (33 loc) · 1.25 KB
/
handler_resolver.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# frozen_string_literal: true
require "rabbit"
require "rabbit/receiving"
require "rabbit/event_handler"
module Rabbit::Receiving::HandlerResolver
UnsupportedEvent = Class.new(StandardError)
class << self
def handler_for(message)
@handler_cache ||= Hash.new do |cache, (group_id, event)|
handler = unmemoized_handler_for(group_id, event)
cache[[group_id, event]] = handler if Rabbit.config.environment == :production
handler
end
@handler_cache[[message.group_id, message.event]]
end
private
def unmemoized_handler_for(group_id, event)
handler = if Rabbit.config.handler_resolver_callable.is_a?(Proc)
Rabbit.config.handler_resolver_callable.call(group_id, event)
else
name = "rabbit/handler/#{group_id}/#{event}".camelize
name.safe_constantize
end
if handler && handler < Rabbit::EventHandler
handler
else
raise UnsupportedEvent, "#{event.inspect} event from #{group_id.inspect} group is not " \
"supported, it requires a #{name.inspect} class inheriting from " \
"\"Rabbit::EventHandler\" to be defined"
end
end
end
end