summaryrefslogtreecommitdiff
path: root/lib/nickserver/email_address.rb
blob: 20f642c5bcf7674ea97dd038deee7c6e4ce5a1ae (plain)
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
43
44
45
46
47
48
49
50
51
52
53
module Nickserver
  class EmailAddress

    REGEXP = begin
               qtext = '[^\\x0d\\x22\\x5c\\x80-\\xff]'
               dtext = '[^\\x0d\\x5b-\\x5d\\x80-\\xff]'
               atom = '[^\\x00-\\x20\\x22\\x28\\x29\\x2c\\x2e\\x3a-\\x3c\\x3e\\x40\\x5b-\\x5d\\x7f-\\xff]+'
               quoted_pair = '\\x5c[\\x00-\\x7f]'
               domain_literal = "\\x5b(?:#{dtext}|#{quoted_pair})*\\x5d"
               quoted_string = "\\x22(?:#{qtext}|#{quoted_pair})*\\x22"
               domain_ref = atom
               sub_domain = "(?:#{domain_ref}|#{domain_literal})"
               word = "(?:#{atom}|#{quoted_string})"
               domain = "#{sub_domain}(?:\\x2e#{sub_domain})*"
               local_part = "#{word}(?:\\x2e#{word})*"
               addr_spec = "#{local_part}\\x40#{domain}"
               /\A#{addr_spec}\z/n
             end

    def initialize(address)
      @address = address.to_s
    end

    def valid?
      address =~ REGEXP
    end

    def invalid?
      !valid?
    end

    def domain?(domain)
      domain == self.domain
    end

    def domain
      address.split('@')[1]
    end

    def local_part
      address.split('@')[0]
    end

    def to_s
      address
    end

    protected

    attr_reader :address

  end
end