MessagesContainer::merge()   A
last analyzed

Complexity

Conditions 4
Paths 4

Size

Total Lines 16
Code Lines 10

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 11
CRAP Score 4

Importance

Changes 0
Metric Value
cc 4
eloc 10
nc 4
nop 1
dl 0
loc 16
ccs 11
cts 11
cp 1
crap 4
rs 9.9332
c 0
b 0
f 0
1
<?php
2
3
declare(strict_types = 1);
4
5
namespace Hop\Validator\Message;
6
7
class MessagesContainer implements MessageInterface, \Countable, \IteratorAggregate
8
{
9
    /**
10
     * @var MessageInterface[]
11
     */
12
    private $messages = [];
13
14
    /**
15
     * @param string $index
16
     * @param MessageInterface $message
17
     */
18 11
    public function attachMessage(string $index, MessageInterface $message): void
19
    {
20 11
        if (isset($this->messages[$index])) {
21 2
            $this->messages[$index] = $this->messages[$index]->merge($message);
22 2
            return;
23
        }
24 11
        $this->messages[$index] = $message;
25 11
    }
26
27 13
    public function count(): int
28
    {
29 13
        $cnt = 0;
30 13
        foreach ($this->messages as $message) {
31 11
            $cnt+= $message->count();
32
        }
33 13
        return $cnt;
34
    }
35
36
    public function getIterator()
37
    {
38
        return new \ArrayIterator($this->messages);
39
    }
40
41
    /**
42
     * @return array
43
     */
44 6
    public function toArray(): array
45
    {
46 6
        $array = [];
47 6
        foreach ($this->messages as $index => $message) {
48 6
            if ($message->count() === 0) {
49 4
                continue;
50
            }
51 6
            $array[$index] = $message->toArray();
52
        }
53 6
        return $array;
54
    }
55
56
    /**
57
     * @return array
58
     */
59 2
    public function getMessages(): array
60
    {
61 2
        return $this->messages;
62
    }
63
64
    /**
65
     * @param mixed $index
66
     * @return MessageInterface|null
67
     */
68 2
    public function findByIndex($index): ?MessageInterface
69
    {
70 2
        if (!isset($this->messages[$index])) {
71 1
            return null;
72
        }
73 2
        return $this->messages[$index];
74
    }
75
76
    /**
77
     * @inheritdoc
78
     */
79 3
    public function merge(MessageInterface $message): MessageInterface
80
    {
81 3
        if (!$message instanceof static) {
82 1
            throw new \InvalidArgumentException('Message must be a container');
83
        }
84
85 2
        $cloned = clone $this;
86 2
        foreach ($message->getMessages() as $index => $mergeMessage) {
87 2
            $foundMessage = $cloned->findByIndex($index);
88 2
            if ($foundMessage === null) {
89 1
                $cloned->attachMessage($index, $mergeMessage);
90 1
                continue;
91
            }
92 2
            $cloned->attachMessage($index, $foundMessage->merge($mergeMessage));
93
        }
94 2
        return $cloned;
95
    }
96
}
97