Skip to content

Instantly share code, notes, and snippets.

@sergio-fry
Created October 13, 2025 13:39
Show Gist options
  • Save sergio-fry/ea58049b0652ee61b88b50ebbfc276ce to your computer and use it in GitHub Desktop.
Save sergio-fry/ea58049b0652ee61b88b50ebbfc276ce to your computer and use it in GitHub Desktop.
module Automator
class Exchange
class Subscription
attr_reader :listener
def initialize(pattern, listener)
@pattern = pattern
@listener = listener
end
def listen_to?(event_type)
case @pattern
when String
@pattern == event_type
when Regexp
event_type.match?(@pattern)
else
raise "Unknown pattern type #{@pattern.class}"
end
end
def call(event_type, data) = @listener.call(event_type, data)
end
def initialize(logger:)
@subscripions = []
@logger = logger
end
def subscribe(pattern, listener)
@subscripions << Subscription.new(pattern, listener)
end
def publish(event_type, data = nil)
@logger.debug "EVENT #{event_type} #{data.is_a?(String) ? data : data&.to_json}"
@subscripions.each do |subscripion|
execute_subscription(event_type, data, subscripion)
end
end
def execute_subscription(event_type, data, subscripion)
if subscripion.listen_to?(event_type.to_s)
if data.nil?
@logger.info "Starting #{subscripion.listener.class}"
else
@logger.info "Starting #{subscripion.listener.class} with data=#{data.to_json}"
end
subscripion.call(event_type.to_s, data)
@logger.info "Completed #{subscripion.listener.class}"
end
rescue StandardError => e
@logger.error "Error excuting #{subscripion.listener.class}"
@logger.error e.message
@logger.error e.backtrace.join("\n")
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment