Passed
Push — master ( 5fbb2b...dd780e )
by John
05:13
created

EmailValidator::resetErrorCode()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 1
c 0
b 0
f 0
dl 0
loc 3
rs 10
cc 1
nc 1
nop 0
1
<?php
2
3
declare(strict_types=1);
4
5
namespace EmailValidator;
6
7
use EmailValidator\Validator\BannedListValidator;
8
use EmailValidator\Validator\BasicValidator;
9
use EmailValidator\Validator\DisposableEmailValidator;
10
use EmailValidator\Validator\FreeEmailValidator;
11
use EmailValidator\Validator\MxValidator;
12
13
class EmailValidator
14
{
15
    public const NO_ERROR = 0;
16
17
    public const FAIL_BASIC = 1;
18
19
    public const FAIL_MX_RECORD = 2;
20
21
    public const FAIL_BANNED_DOMAIN = 3;
22
23
    public const FAIL_DISPOSABLE_DOMAIN = 4;
24
25
    public const FAIL_FREE_PROVIDER = 5;
26
27
    /**
28
     * @var BasicValidator
29
     */
30
    private $basicValidator;
31
32
    /**
33
     * @var MxValidator
34
     */
35
    private $mxValidator;
36
37
    /**
38
     * @var BannedListValidator
39
     */
40
    private $bannedListValidator;
41
42
    /**
43
     * @var DisposableEmailValidator
44
     */
45
    private $disposableEmailValidator;
46
47
    /**
48
     * @var FreeEmailValidator
49
     */
50
    private $freeEmailValidator;
51
52
    /**
53
     * @var int
54
     */
55
    private $reason;
56
57
    public function __construct(array $config = [])
58
    {
59
        $policy = new Policy($config);
60
61
        $this->mxValidator = new MxValidator($policy);
62
        $this->basicValidator = new BasicValidator($policy);
63
        $this->bannedListValidator = new BannedListValidator($policy);
64
        $this->disposableEmailValidator = new DisposableEmailValidator($policy);
65
        $this->freeEmailValidator = new FreeEmailValidator($policy);
66
    }
67
68
    /**
69
     * Validate an email address by the rules set forth in the Policy
70
     *
71
     * @param string $email
72
     * @return bool
73
     */
74
    public function validate(string $email): bool
75
    {
76
        $this->resetErrorCode();
77
78
        $emailAddress = new EmailAddress($email);
79
80
        if (!$this->basicValidator->validate($emailAddress)) {
81
            $this->reason = self::FAIL_BASIC;
82
        } elseif (!$this->mxValidator->validate($emailAddress)) {
83
            $this->reason = self::FAIL_MX_RECORD;
84
        } elseif (!$this->bannedListValidator->validate($emailAddress)) {
85
            $this->reason = self::FAIL_BANNED_DOMAIN;
86
        } elseif (!$this->disposableEmailValidator->validate($emailAddress)) {
87
            $this->reason = self::FAIL_DISPOSABLE_DOMAIN;
88
        } elseif (!$this->freeEmailValidator->validate($emailAddress)) {
89
            $this->reason = self::FAIL_FREE_PROVIDER;
90
        }
91
92
        return $this->reason === self::NO_ERROR;
93
    }
94
95
    /**
96
     * Returns the error code constant value for invalid email addresses.
97
     *
98
     * For use by integrating systems to create their own error messages.
99
     *
100
     * @since 1.0.1
101
     * @return int
102
     */
103
    public function getErrorCode(): int
104
    {
105
        return $this->reason;
106
    }
107
108
    /**
109
     * Returns an error message for invalid email addresses
110
     *
111
     * @return string
112
     */
113
    public function getErrorReason(): string
114
    {
115
        switch ($this->reason) {
116
            case self::FAIL_BASIC:
117
                $msg = 'Invalid format';
118
                break;
119
            case self::FAIL_MX_RECORD:
120
                $msg = 'Domain does not accept email';
121
                break;
122
            case self::FAIL_BANNED_DOMAIN:
123
                $msg = 'Domain is banned';
124
                break;
125
            case self::FAIL_DISPOSABLE_DOMAIN:
126
                $msg = 'Domain is used by disposable email providers';
127
                break;
128
            case self::FAIL_FREE_PROVIDER:
129
                $msg = 'Domain is used by free email providers';
130
                break;
131
            case self::NO_ERROR:
132
            default:
133
                $msg = '';
134
        }
135
136
        return $msg;
137
    }
138
139
    /**
140
     * Resets the error code so each validation starts off defaulting to "valid"
141
     *
142
     * @since 1.0.2
143
     * @return void
144
     */
145
    private function resetErrorCode(): void
146
    {
147
        $this->reason = self::NO_ERROR;
148
    }
149
}
150