Passed
Push — master ( 4d3ab4...c7603d )
by John
05:01
created

EmailValidator::validate()   A

Complexity

Conditions 6
Paths 6

Size

Total Lines 17
Code Lines 12

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 12
c 1
b 0
f 0
dl 0
loc 17
rs 9.2222
cc 6
nc 6
nop 1
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 an error message for invalid email addresses
97
     *
98
     * @return string
99
     */
100
    public function getErrorReason(): string
101
    {
102
        switch ($this->reason) {
103
            case self::FAIL_BASIC:
104
                $msg = 'Invalid format';
105
                break;
106
            case self::FAIL_MX_RECORD:
107
                $msg = 'Domain does not accept email';
108
                break;
109
            case self::FAIL_BANNED_DOMAIN:
110
                $msg = 'Domain is banned';
111
                break;
112
            case self::FAIL_DISPOSABLE_DOMAIN:
113
                $msg = 'Domain is used by disposable email providers';
114
                break;
115
            case self::FAIL_FREE_PROVIDER:
116
                $msg = 'Domain is used by free email providers';
117
                break;
118
            case self::NO_ERROR:
119
            default:
120
                $msg = '';
121
        }
122
123
        return $msg;
124
    }
125
}
126