Sha256: 6a7b8c31ffff336753550b1e9bd7f1534fe952bb0eba84799ff0925d993e9e67

Contents?: true

Size: 1.31 KB

Versions: 1

Compression:

Stored size: 1.31 KB

Contents

# frozen_string_literal: true

unless "".respond_to?(:safe_constantize)
  require "active_delivery/ext/string_constantize"
  using ActiveDelivery::Ext::StringConstantize
end

module ActiveDelivery
  module Lines
    # AbstractNotifier line for Active Delivery.
    #
    # You must provide custom `resolver` to infer notifier class
    # (if String#safe_constantize is defined, we convert "*Delivery" -> "*Notifier").
    #
    # Resolver is a callable object.
    class Notifier < ActiveDelivery::Lines::Base
      DEFAULT_SUFFIX = "Notifier"

      def initialize(**opts)
        super
        @resolver ||= build_resolver(options.fetch(:suffix, DEFAULT_SUFFIX))
      end

      def resolve_class(klass)
        resolver&.call(klass)
      end

      def notify?(method_name)
        return unless handler_class
        handler_class.action_methods.include?(method_name.to_s)
      end

      def notify_now(handler, mid, *args)
        handler.public_send(mid, *args).notify_now
      end

      def notify_later(handler, mid, *args)
        handler.public_send(mid, *args).notify_later
      end

      private

      attr_reader :resolver

      def build_resolver(suffix)
        lambda do |klass|
          klass_name = klass.name
          klass_name&.sub(/Delivery\z/, suffix)&.safe_constantize
        end
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
active_delivery-1.0.0 lib/active_delivery/lines/notifier.rb