aboutsummaryrefslogblamecommitdiffstats
path: root/actionmailbox/lib/action_mailbox/router/route.rb
blob: adb9f94c1a41bd6ae6fa2a2e6c171c2db2463517 (plain) (tree)
1
2
3
4
5
6
7
8
9
10

                             


                                                                                                                
                                  



                                         

                        



                           

             
               
                                                                                    
               
                                                                                  


                                 
                                   



                   
                                                      
     

         
                            

                                                                                                                   

         
   
# frozen_string_literal: true

# Encapsulates a route, which can then be matched against an inbound_email and provide a lookup of the matching
# mailbox class. See examples for the different route addresses and how to use them in the `ActionMailbox::Base`
# documentation.
class ActionMailbox::Router::Route
  attr_reader :address, :mailbox_name

  def initialize(address, to:)
    @address, @mailbox_name = address, to

    ensure_valid_address
  end

  def match?(inbound_email)
    case address
    when :all
      true
    when String
      inbound_email.mail.recipients.any? { |recipient| address.casecmp?(recipient) }
    when Regexp
      inbound_email.mail.recipients.any? { |recipient| address.match?(recipient) }
    when Proc
      address.call(inbound_email)
    else
      address.match?(inbound_email)
    end
  end

  def mailbox_class
    "#{mailbox_name.to_s.camelize}Mailbox".constantize
  end

  private
    def ensure_valid_address
      unless [ Symbol, String, Regexp, Proc ].any? { |klass| address.is_a?(klass) } || address.respond_to?(:match?)
        raise ArgumentError, "Expected a Symbol, String, Regexp, Proc, or matchable, got #{address.inspect}"
      end
    end
end