Passed
Pull Request — master (#190)
by SignpostMarv
02:13
created

EmailParser::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 6

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 5
CRAP Score 1

Importance

Changes 0
Metric Value
c 0
b 0
f 0
dl 0
loc 6
ccs 5
cts 5
cp 1
rs 10
cc 1
nc 1
nop 1
crap 1
1
<?php
2
3
namespace Egulias\EmailValidator;
4
5
use Egulias\EmailValidator\Exception\ExpectingATEXT;
6
use Egulias\EmailValidator\Exception\NoLocalPart;
7
use Egulias\EmailValidator\Parser\DomainPart;
8
use Egulias\EmailValidator\Parser\LocalPart;
9
use Egulias\EmailValidator\Warning\EmailTooLong;
10
11
/**
12
 * EmailParser
13
 *
14
 * @author Eduardo Gulias Davis <[email protected]>
15
 */
16
class EmailParser
17
{
18
    const EMAIL_MAX_LENGTH = 254;
19
20
    /**
21
     * @var array
22
     */
23
    protected $warnings = [];
24
25
    /**
26
     * @var string
27
     */
28
    protected $domainPart = '';
29
30
    /**
31
     * @var string
32
     */
33
    protected $localPart = '';
34
    /**
35
     * @var EmailLexer
36
     */
37
    protected $lexer;
38
39
    /**
40
     * @var LocalPart
41
     */
42
    protected $localPartParser;
43
44
    /**
45
     * @var DomainPart
46
     */
47
    protected $domainPartParser;
48
49 129
    public function __construct(EmailLexer $lexer)
50
    {
51 129
        $this->lexer = $lexer;
52 129
        $this->localPartParser = new LocalPart($this->lexer);
53 129
        $this->domainPartParser = new DomainPart($this->lexer);
54 129
    }
55
56
    /**
57
     * @param string $str
58
     * @return array
59
     */
60 129
    public function parse($str)
61
    {
62 129
        $this->lexer->setInput($str);
63
64 129
        if (!$this->hasAtToken()) {
65 1
            throw new NoLocalPart();
66
        }
67
68
69 128
        $this->localPartParser->parse($str);
70 91
        $this->domainPartParser->parse($str);
71
72 52
        $this->setParts($str);
73
74 52
        if ($this->lexer->hasInvalidTokens()) {
75
            throw new ExpectingATEXT();
76
        }
77
78 52
        return array('local' => $this->localPart, 'domain' => $this->domainPart);
79
    }
80
81
    /**
82
     * @return Warning\Warning[]
83
     */
84 52
    public function getWarnings()
85
    {
86 52
        $localPartWarnings = $this->localPartParser->getWarnings();
87 52
        $domainPartWarnings = $this->domainPartParser->getWarnings();
88 52
        $this->warnings = array_merge($localPartWarnings, $domainPartWarnings);
89
90 52
        $this->addLongEmailWarning($this->localPart, $this->domainPart);
91
92 52
        return $this->warnings;
93
    }
94
95
    /**
96
     * @return string
97
     */
98
    public function getParsedDomainPart()
99
    {
100
        return $this->domainPart;
101
    }
102
103
    /**
104
     * @param string $email
105
     */
106 52
    protected function setParts($email)
107
    {
108 52
        $parts = explode('@', $email);
109 52
        $this->domainPart = $this->domainPartParser->getDomainPart();
110 52
        $this->localPart = $parts[0];
111 52
    }
112
113
    /**
114
     * @return bool
115
     */
116 129
    protected function hasAtToken()
117
    {
118 129
        $this->lexer->moveNext();
119 129
        $this->lexer->moveNext();
120 129
        if ($this->lexer->token['type'] === EmailLexer::S_AT) {
121 1
            return false;
122
        }
123
124 128
        return true;
125
    }
126
127
    /**
128
     * @param string $localPart
129
     * @param string $parsedDomainPart
130
     */
131 52
    protected function addLongEmailWarning($localPart, $parsedDomainPart)
132
    {
133 52
        if (strlen($localPart . '@' . $parsedDomainPart) > self::EMAIL_MAX_LENGTH) {
134 3
            $this->warnings[EmailTooLong::CODE] = new EmailTooLong();
135 3
        }
136 52
    }
137
}
138