Sha256: 2018edeef257a9974e2ec0abc957c345a74eed858b2ce8c834a28345b46a6c89

Contents?: true

Size: 1.57 KB

Versions: 2

Compression:

Stored size: 1.57 KB

Contents

# frozen_string_literal: true

require "active_model"

module AetherObservatory
  class EventBase
    include ActiveModel::AttributeAssignment
    include ActiveModel::Attributes

    class << self
      def inherited(subclass)
        super
        subclass.event_prefix(&event_prefix)
      end

      def create(**attributes)
        event = new(**attributes)
        event_names_with_prefix.each do |event_name_parts|
          event_name = event_name_parts.filter_map do |part|
            event.instance_exec(&part) unless part.nil?
          end.join(".")
          logger.debug("[#{name}] Create event for topic: [#{event_name}]")
          ActiveSupport::Notifications.instrument(event_name, event)
        end

        nil
      end

      def event_prefix(value = nil, &block)
        @event_prefix = -> { value } if value.present?
        @event_prefix = block if block.present?

        @event_prefix
      end

      def event_name(value = nil, &block)
        event_names << -> { value } if value.present?
        event_names << block if block.present?

        nil
      end

      def event_names_with_prefix
        event_names.map { |event_name| [event_prefix, event_name] }
      end

      def event_names
        @event_names ||= []
      end

      def logger(value = nil)
        @logger = value if value.present?

        @logger || AetherObservatory.config.logger
      end
    end

    delegate :event_name, to: "self.class"
    delegate :logger, to: "self.class"

    def initialize(attributes = {})
      super()
      assign_attributes(attributes) if attributes
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
aether_observatory-1.0.0 lib/aether_observatory/event_base.rb
aether_observatory-0.0.1pre4 lib/aether_observatory/event_base.rb