Completed
Pull Request — develop (#9)
by Daan van
10:15 queued 07:39
created

EmailAddressList::contains()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 10
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 1
Metric Value
c 1
b 0
f 1
dl 0
loc 10
rs 9.4285
cc 3
eloc 5
nc 3
nop 1
1
<?php
2
3
namespace OpenConext\Value\Saml\Metadata\ContactPerson;
4
5
use ArrayIterator;
6
use Countable;
7
use IteratorAggregate;
8
use OpenConext\Value\Exception\IndexOutOfBoundsException;
9
use OpenConext\Value\Exception\InvalidArgumentException;
10
11
final class EmailAddressList implements Countable, IteratorAggregate
12
{
13
    /**
14
     * @var EmailAddress[]
15
     */
16
    private $emailAddresses;
17
18
    /**
19
     * @param EmailAddress[] $emailAddresses
20
     */
21
    public function __construct(array $emailAddresses)
22
    {
23
        foreach ($emailAddresses as $index => $emailAddress) {
24
            if (!$emailAddress instanceof EmailAddress) {
25
                throw new InvalidArgumentException(sprintf(
26
                    'Unexpected value found when creating EmailAddressList at index "%d": "%s"',
27
                    $index,
28
                    (is_object($emailAddress) ? get_class($emailAddress) : gettype($emailAddress))
29
                ));
30
            }
31
32
            $this->emailAddresses[] = $emailAddress;
33
        }
34
    }
35
36
    /**
37
     * @param EmailAddress $emailAddress
38
     * @return EmailAddressList
39
     */
40
    public function add(EmailAddress $emailAddress)
41
    {
42
        return new self(array_merge($this->emailAddresses, array($emailAddress)));
43
    }
44
45
    /**
46
     * @param EmailAddress $emailAddress
47
     * @return bool
48
     */
49
    public function contains(EmailAddress $emailAddress)
50
    {
51
        foreach ($this->emailAddresses as $address) {
52
            if ($address->equals($emailAddress)) {
53
                return true;
54
            }
55
        }
56
57
        return false;
58
    }
59
60
    /**
61
     * @param EmailAddress $emailAddress
62
     * @return int
63
     */
64
    public function indexOf(EmailAddress $emailAddress)
65
    {
66
        foreach ($this->emailAddresses as $index => $address) {
67
            if ($address->equals($emailAddress)) {
68
                return $index;
69
            }
70
        }
71
72
        return -1;
73
    }
74
75
    /**
76
     * @param int $index
77
     * @return EmailAddress
78
     */
79
    public function get($index)
80
    {
81
        if (!is_int($index)) {
82
            throw InvalidArgumentException::invalidType('integer', 'index', $index);
83
        }
84
85
        if ($index < 0) {
86
            throw IndexOutOfBoundsException::tooLow($index, 0);
87
        }
88
89
        if ($index > count($this->emailAddresses) - 1) {
90
            throw IndexOutOfBoundsException::tooHigh($index, count($this->emailAddresses) - 1);
91
        }
92
93
        return $this->emailAddresses[$index];
94
    }
95
96
    /**
97
     * @param EmailAddressList $other
98
     * @return bool
99
     */
100
    public function equals(EmailAddressList $other)
101
    {
102
        if (count($this->emailAddresses) !== count($other->emailAddresses)) {
103
            return false;
104
        }
105
106
        foreach ($this->emailAddresses as $index => $emailAddress) {
107
            if (!$emailAddress->equals($other->emailAddresses[$index])) {
108
                return false;
109
            }
110
        }
111
112
        return true;
113
    }
114
115
    /**
116
     * @return EmailAddress[]
117
     */
118
    public function toArray()
119
    {
120
        return $this->emailAddresses;
121
    }
122
123
    public function getIterator()
124
    {
125
        return new ArrayIterator($this->emailAddresses);
126
    }
127
128
    public function count()
129
    {
130
        return count($this->emailAddresses);
131
    }
132
133
    public function __toString()
134
    {
135
        return sprintf('EmailAddressList[%s]', implode(', ', $this->emailAddresses));
136
    }
137
}
138