File: route.rb

package info (click to toggle)
rails 2%3A7.2.2.1%2Bdfsg-7
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 43,352 kB
  • sloc: ruby: 349,799; javascript: 30,703; yacc: 46; sql: 43; sh: 29; makefile: 27
file content (42 lines) | stat: -rw-r--r-- 1,273 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# frozen_string_literal: true

module ActionMailbox
  # 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 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
end