Completed
Push — master ( a67e7e...95640a )
by Tomasz
02:42
created

MessagesContainer   A

Complexity

Total Complexity 15

Size/Duplication

Total Lines 88
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
dl 0
loc 88
rs 10
c 0
b 0
f 0
wmc 15

7 Methods

Rating   Name   Duplication   Size   Complexity  
A attachMessage() 0 7 2
A findByIndex() 0 6 2
A merge() 0 16 4
A count() 0 7 2
A getMessages() 0 3 1
A toArray() 0 10 3
A getIterator() 0 3 1
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
    public function attachMessage(string $index, MessageInterface $message): void
19
    {
20
        if (isset($this->messages[$index])) {
21
            $this->messages[$index] = $this->messages[$index]->merge($message);
22
            return;
23
        }
24
        $this->messages[$index] = $message;
25
    }
26
27
    public function count(): int
28
    {
29
        $cnt = 0;
30
        foreach ($this->messages as $message) {
31
            $cnt+= $message->count();
32
        }
33
        return $cnt;
34
    }
35
36
    public function getIterator()
37
    {
38
        return new \ArrayIterator($this->messages);
39
    }
40
41
    /**
42
     * @return array
43
     */
44
    public function toArray(): array
45
    {
46
        $array = [];
47
        foreach ($this->messages as $index => $message) {
48
            if ($message->count() === 0) {
49
                continue;
50
            }
51
            $array[$index] = $message->toArray();
52
        }
53
        return $array;
54
    }
55
56
    /**
57
     * @return array
58
     */
59
    public function getMessages(): array
60
    {
61
        return $this->messages;
62
    }
63
64
    /**
65
     * @param mixed $index
66
     * @return MessageInterface|null
67
     */
68
    public function findByIndex($index): ?MessageInterface
69
    {
70
        if (!isset($this->messages[$index])) {
71
            return null;
72
        }
73
        return $this->messages[$index];
74
    }
75
76
    /**
77
     * @inheritdoc
78
     */
79
    public function merge(MessageInterface $message): MessageInterface
80
    {
81
        if (!$message instanceof static) {
82
            throw new \InvalidArgumentException('Message must be a container');
83
        }
84
85
        $cloned = clone $this;
86
        foreach ($message->getMessages() as $index => $mergeMessage) {
87
            $foundMessage = $cloned->findByIndex($index);
88
            if ($foundMessage === null) {
89
                $cloned->attachMessage($index, $mergeMessage);
90
                continue;
91
            }
92
            $cloned->attachMessage($index, $foundMessage->merge($mergeMessage));
93
        }
94
        return $cloned;
95
    }
96
}
97