Passed
Pull Request — master (#69)
by
unknown
05:00
created

Zone::addResourceRecord()   A

Complexity

Conditions 4
Paths 3

Size

Total Lines 10
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 4
CRAP Score 4.5923

Importance

Changes 0
Metric Value
cc 4
eloc 5
c 0
b 0
f 0
nc 3
nop 2
dl 0
loc 10
ccs 4
cts 6
cp 0.6667
crap 4.5923
rs 10
1
<?php
2
3
declare(strict_types=1);
4
5
/*
6
 * This file is part of Badcow DNS Library.
7
 *
8
 * (c) Samuel Williams <[email protected]>
9
 *
10
 * For the full copyright and license information, please view the LICENSE
11
 * file that was distributed with this source code.
12
 */
13
14
namespace Badcow\DNS;
15
16
class Zone implements \Countable, \IteratorAggregate, \ArrayAccess
17
{
18
    /**
19
     * @var string
20
     */
21
    protected $name;
22
23
    /**
24
     * @var int
25
     */
26
    protected $defaultTtl;
27
28
    /**
29
     * @var ResourceRecord[]
30
     */
31
    private $resourceRecords = [];
32
33
    /**
34
     * Zone constructor.
35
     *
36
     * @param string|null $name
37
     * @param int|null    $defaultTtl
38
     * @param array       $resourceRecords
39
     */
40 42
    public function __construct(?string $name = null, ?int $defaultTtl = null, array $resourceRecords = [])
41
    {
42 42
        if (null !== $name) {
43 41
            $this->setName($name);
44
        }
45
46 42
        if (null !== $defaultTtl) {
47 14
            $this->setDefaultTtl($defaultTtl);
48
        }
49
50 42
        $this->fromArray($resourceRecords);
51 42
    }
52
53
    /**
54
     * @param string $name
55
     *
56
     * @throws \InvalidArgumentException
57
     */
58 42
    public function setName(string $name): void
59
    {
60 42
        if (!Validator::fullyQualifiedDomainName($name)) {
61 1
            throw new \InvalidArgumentException(sprintf('Zone "%s" is not a fully qualified domain name.', $name));
62
        }
63
64 42
        $this->name = $name;
65 42
    }
66
67
    /**
68
     * @return string
69
     */
70 9
    public function getName(): string
71
    {
72 9
        return $this->name;
73
    }
74
75
    /**
76
     * @return int
77
     */
78 30
    public function getDefaultTtl(): ?int
79
    {
80 30
        return $this->defaultTtl;
81
    }
82
83
    /**
84
     * @param int $defaultTtl
85
     */
86 24
    public function setDefaultTtl(int $defaultTtl): void
87
    {
88 24
        $this->defaultTtl = $defaultTtl;
89 24
    }
90
91
    /**
92
     * @return ResourceRecord[]
93
     */
94 20
    public function getResourceRecords(): array
95
    {
96 20
        return $this->resourceRecords;
97
    }
98
99
    /**
100
     * @param ResourceRecord[] $resourceRecords
101
     */
102 42
    public function fromArray(array $resourceRecords): void
103
    {
104 42
        foreach ($resourceRecords as $resourceRecord) {
105 16
            $this->addResourceRecord($resourceRecord);
106
        }
107 42
    }
108
109
    /**
110
     * @param ResourceRecord ...$resourceRecords
111
     */
112 2
    public function fromList(ResourceRecord ...$resourceRecords): void
113
    {
114 2
        $this->fromArray($resourceRecords);
115 2
    }
116
117
    /**
118
     * @param ResourceRecord $resourceRecord
119
     * @param bool           $verify
120
     *
121
     * @throws \Exception
122
     */
123 38
    public function addResourceRecord(ResourceRecord $resourceRecord, bool $verify = false): void
124
    {
125 38
        $class = __NAMESPACE__.'\\Validator\\'.$resourceRecord->getClass().'Validator';
126 38
        if ($verify && class_exists($class)) {
127
            if (!$class::canAddToZone($this, $resourceRecord)) {
128
                throw new \Exception('Invalid resource record');
129
            }
130
        }
131
132 38
        $this->resourceRecords[] = $resourceRecord;
133 38
    }
134
135
    /**
136
     * @return \ArrayIterator
137
     */
138 14
    public function getIterator(): \ArrayIterator
139
    {
140 14
        return new \ArrayIterator($this->resourceRecords);
141
    }
142
143
    /**
144
     * @return int
145
     */
146 8
    public function count(): int
147
    {
148 8
        return \count($this->resourceRecords);
149
    }
150
151
    /**
152
     * @return bool
153
     */
154 1
    public function isEmpty(): bool
155
    {
156 1
        return empty($this->resourceRecords);
157
    }
158
159
    /**
160
     * @param ResourceRecord $resourceRecord
161
     *
162
     * @return bool
163
     */
164 1
    public function contains(ResourceRecord $resourceRecord): bool
165
    {
166 1
        foreach ($this->resourceRecords as $_item) {
167 1
            if ($_item === $resourceRecord) {
168 1
                return true;
169
            }
170
        }
171
172 1
        return false;
173
    }
174
175
    /**
176
     * @param ResourceRecord $resourceRecord
177
     *
178
     * @return bool
179
     */
180 2
    public function remove(ResourceRecord $resourceRecord): bool
181
    {
182 2
        foreach ($this->resourceRecords as $key => $_item) {
183 2
            if ($_item === $resourceRecord) {
184 2
                unset($this->resourceRecords[$key]);
185
186 2
                return true;
187
            }
188
        }
189
190 1
        return false;
191
    }
192
193
    /**
194
     * Return the class of the zone, defaults to 'IN'.
195
     *
196
     * @return string
197
     */
198 2
    public function getClass(): string
199
    {
200 2
        foreach ($this->resourceRecords as $resourceRecord) {
201 2
            if (null !== $resourceRecord->getClass()) {
202 2
                return $resourceRecord->getClass();
203
            }
204
        }
205
206 1
        return Classes::INTERNET;
207
    }
208
209
    /**
210
     * @param mixed $offset
211
     *
212
     * @return bool
213
     */
214 2
    public function offsetExists($offset): bool
215
    {
216 2
        return array_key_exists($offset, $this->resourceRecords);
217
    }
218
219
    /**
220
     * @param mixed $offset
221
     *
222
     * @return ResourceRecord
223
     */
224 5
    public function offsetGet($offset): ResourceRecord
225
    {
226 5
        return $this->resourceRecords[$offset];
227
    }
228
229
    /**
230
     * @param mixed $offset
231
     * @param mixed $value
232
     */
233 1
    public function offsetSet($offset, $value): void
234
    {
235 1
        $this->resourceRecords[$offset] = $value;
236 1
    }
237
238
    /**
239
     * @param mixed $offset
240
     */
241 1
    public function offsetUnset($offset): void
242
    {
243 1
        unset($this->resourceRecords[$offset]);
244 1
    }
245
}
246