module Messaging # Public: Used by Messaging.routes to setup the routes for matching messages to callables # # See routing.rb for more information. class Routes include Routing # Creates a consumer for the default adapter # # @param name [Symbol] the name of the consumer. def consumer(name, **options, &block) consumer_definitions[name] = { options: options, block: block } end def define_consumers! return unless consumers.empty? consumer_definitions.each do |name, definition| c = Messaging.consumer_adapter.create_consumer(name, definition.fetch(:options)) definition.fetch(:block)&.call(c) consumers << c end end # Keeps the consumers, but reload their subscriptions so code reloading works. # The consumer has a reference to the class name of each of its handlers, # if the handler is reloaded the reference would point to an old instance. def reload_consumer_routes! consumers.each do |c| c.clear_routes! consumer_definitions[c.name].fetch(:block)&.call(c) end end def consumers @consumers ||= [] end # Public: Evaluate route definition. def draw(&block) instance_eval(&block) end private def consumer_definitions @consumer_definitions ||= {} end end end