Test Setup Failed
Push — 3.0.0-dev ( e272a2...73dc53 )
by Eduardo Gulias
01:50
created

EmailParser::processLocalPart()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 11

Duplication

Lines 11
Ratio 100 %

Importance

Changes 0
Metric Value
dl 11
loc 11
rs 9.9
c 0
b 0
f 0
cc 1
nc 1
nop 0
1
<?php
2
3
namespace Egulias\EmailValidator;
4
5
use Egulias\EmailValidator\EmailLexer;
6
use Egulias\EmailValidator\Result\Result;
7
use Egulias\EmailValidator\Parser\LocalPart;
8
use Egulias\EmailValidator\Parser\DomainPart;
9
use Egulias\EmailValidator\Result\ValidEmail;
10
use Egulias\EmailValidator\Result\InvalidEmail;
11
use Egulias\EmailValidator\Warning\EmailTooLong;
12
use Egulias\EmailValidator\Result\Reason\ExpectingATEXT;
13
use Egulias\EmailValidator\Result\Reason\NoLocalPart;
14
15
class EmailParser
16
{
17
    const EMAIL_MAX_LENGTH = 254;
18
19
    /**
20
     * @var array
21
     */
22
    protected $warnings = [];
23
24
    /**
25
     * @var string
26
     */
27
    protected $domainPart = '';
28
29
    /**
30
     * @var string
31
     */
32
    protected $localPart = '';
33
    /**
34
     * @var EmailLexer
35
     */
36
    protected $lexer;
37
38
    /**
39
     * @var LocalPart
40
     */
41
    protected $localPartParser;
42
43
    /**
44
     * @var DomainPart
45
     */
46
    protected $domainPartParser;
47
48
    public function __construct(EmailLexer $lexer)
49
    {
50
        $this->lexer = $lexer;
51
    }
52
53
    /**
54
     * @param string $str
55
     * @return Result 
56
     */
57
    public function parse($str) : Result
58
    {
59
        $this->lexer->setInput($str);
60
61
        if (!$this->hasAtToken()) {
62
            return new InvalidEmail(new NoLocalPart(), $this->lexer->token["value"]);
63
        }
64
65
        $localPartResult = $this->processLocalPart();
66
67
        if ($localPartResult->isInvalid()) {
68
            return $localPartResult;
69
        }
70
71
        $domainPartResult = $this->processDomainPart();
72
73
        if ($domainPartResult->isInvalid()) {
74
            return $domainPartResult;
75
        }
76
77
        if ($this->lexer->hasInvalidTokens()) {
78
            return new InvalidEmail(new ExpectingATEXT("Invalid tokens found"), $this->lexer->token["value"]);
79
        }
80
81
        $this->addLongEmailWarning($this->localPart, $this->domainPart);
82
83
        return new ValidEmail();
84
    }
85
86 View Code Duplication
    private function processLocalPart() : Result
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
87
    {
88
        $this->lexer->startRecording();
89
        $this->localPartParser = new LocalPart($this->lexer);
90
        $localPartResult = $this->localPartParser->parse();
91
        $this->lexer->stopRecording();
92
        $this->localPart = rtrim($this->lexer->getAccumulatedValues(), '@');
93
        $this->warnings = array_merge($this->localPartParser->getWarnings(), $this->warnings);
94
95
        return $localPartResult;
96
    }
97
98 View Code Duplication
    private function processDomainPart() : Result
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
99
    {
100
        $this->lexer->clearRecorded();
101
        $this->lexer->startRecording();
102
        $this->domainPartParser = new DomainPart($this->lexer);
103
        $domainPartResult = $this->domainPartParser->parse();
104
        $this->lexer->stopRecording();
105
        $this->domainPart = $this->lexer->getAccumulatedValues();
106
        $this->warnings = array_merge($this->domainPartParser->getWarnings(), $this->warnings);
107
        
108
        return $domainPartResult;
109
    }
110
111
    /**
112
     * @return Warning\Warning[]
113
     */
114
    public function getWarnings() : array
115
    {
116
        return $this->warnings;
117
    }
118
119
    /**
120
     * @return string
121
     */
122
    public function getDomainPart() : string
123
    {
124
        return $this->domainPart;
125
    }
126
127
    public function getLocalPart() : string
128
    {
129
        return $this->localPart;
130
    }
131
132
    /**
133
     * @return bool
134
     */
135
    protected function hasAtToken() : bool
136
    {
137
        $this->lexer->moveNext();
138
        $this->lexer->moveNext();
139
        if ($this->lexer->token['type'] === EmailLexer::S_AT) {
140
            return false;
141
        }
142
143
        return true;
144
    }
145
146
    /**
147
     * @param string $localPart
148
     * @param string $parsedDomainPart
149
     */
150
    protected function addLongEmailWarning($localPart, $parsedDomainPart) : void
151
    {
152
        if (strlen($localPart . '@' . $parsedDomainPart) > self::EMAIL_MAX_LENGTH) {
153
            $this->warnings[EmailTooLong::CODE] = new EmailTooLong();
154
        }
155
    }
156
}
157