Passed
Push — master ( 3cf34e...2985a0 )
by John
01:35 queued 12s
created

EmailValidator::getErrorCode()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 1
Metric Value
eloc 1
c 1
b 0
f 1
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
        $this->reason = self::NO_ERROR;
60
61
        $policy = new Policy($config);
62
63
        $this->mxValidator = new MxValidator($policy);
64
        $this->basicValidator = new BasicValidator($policy);
65
        $this->bannedListValidator = new BannedListValidator($policy);
66
        $this->disposableEmailValidator = new DisposableEmailValidator($policy);
67
        $this->freeEmailValidator = new FreeEmailValidator($policy);
68
    }
69
70
    /**
71
     * Validate an email address by the rules set forth in the Policy
72
     *
73
     * @param string $email
74
     * @return bool
75
     */
76
    public function validate(string $email): bool
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
     * @return int
101
     */
102
    public function getErrorCode(): int
103
    {
104
        return $this->reason;
105
    }
106
107
    /**
108
     * Returns an error message for invalid email addresses
109
     *
110
     * @return string
111
     */
112
    public function getErrorReason(): string
113
    {
114
        switch ($this->reason) {
115
            case self::FAIL_BASIC:
116
                $msg = 'Invalid format';
117
                break;
118
            case self::FAIL_MX_RECORD:
119
                $msg = 'Domain does not accept email';
120
                break;
121
            case self::FAIL_BANNED_DOMAIN:
122
                $msg = 'Domain is banned';
123
                break;
124
            case self::FAIL_DISPOSABLE_DOMAIN:
125
                $msg = 'Domain is used by disposable email providers';
126
                break;
127
            case self::FAIL_FREE_PROVIDER:
128
                $msg = 'Domain is used by free email providers';
129
                break;
130
            case self::NO_ERROR:
131
            default:
132
                $msg = '';
133
        }
134
135
        return $msg;
136
    }
137
}
138