Completed
Push — master ( 8a6725...9de629 )
by Michał
02:24
created

DefaultMessage::wrapMessage()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 9
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 6
CRAP Score 1

Importance

Changes 0
Metric Value
cc 1
eloc 6
c 0
b 0
f 0
nc 1
nop 0
dl 0
loc 9
rs 9.6666
ccs 6
cts 6
cp 1
crap 1
1
<?php
2
3
namespace SimpleLog\Message;
4
5
use Psr\Log\InvalidArgumentException;
6
7
class DefaultMessage implements MessageInterface
8
{
9
    /**
10
     * @var string
11
     */
12
    protected $message = '';
13
14
    /**
15
     * @param string|array|object $message
16
     * @param array $context
17
     * @return $this
18
     * @throws \Psr\Log\InvalidArgumentException
19
     */
20 21
    public function createMessage($message, array $context)
21
    {
22 21
        $this->buildMessage($message)
23 18
            ->wrapMessage()
24 18
            ->buildContext($context);
25
26 18
        return $this;
27
    }
28
29
    /**
30
     * @param array $context
31
     * @return $this
32
     */
33 22
    protected function buildContext(array $context)
34
    {
35 22
        $replace = [];
36
37 22
        foreach ($context as $key => $val) {
38 4
            if (!is_array($val) && (!is_object($val) || method_exists($val, '__toString'))) {
39 4
                $replace['{' . $key . '}'] = $val;
40 4
            }
41 22
        }
42
43 22
        $this->message = strtr($this->message, $replace);
44
45 22
        return $this;
46
    }
47
48
    /**
49
     * @return $this
50
     */
51 13
    protected function wrapMessage()
52
    {
53 13
        $this->message = strftime(self::DATE_TIME_FORMAT, time())
54
            . PHP_EOL
55 13
            . $this->message
56 13
            . '-----------------------------------------------------------'
57 13
            . PHP_EOL;
58
59 13
        return $this;
60
    }
61
62
    /**
63
     * recurrent function to convert array into message
64
     *
65
     * @param string|array|object $message
66
     * @param string $indent
67
     * @return $this
68
     * @throws \Psr\Log\InvalidArgumentException
69
     */
70 21
    protected function buildMessage($message, $indent = '')
71
    {
72 21
        switch (true) {
73 21
            case is_array($message):
74 6
                $this->buildArrayMessage($message, $indent);
75 6
                break;
76
77 15
            case method_exists($message, '__toString'):
78 15
            case is_string($message):
79 12
                $this->message = $message . PHP_EOL;
80 12
                break;
81
82 3
            default:
83 3
                throw new InvalidArgumentException(
84
                    'Incorrect message type. Must be string, array or object with __toString method.'
85 3
                );
86
                break;
87 3
        }
88
89 18
        return $this;
90
    }
91
92
    /**
93
     * @param array $message
94
     * @param string $indent
95
     */
96 6
    protected function buildArrayMessage(array $message, $indent)
97
    {
98 6
        foreach ($message as $key => $value) {
99 6
            $this->processMessage($key, $value, $indent);
100 6
        }
101 6
    }
102
103
    /**
104
     * @param string|int $key
105
     * @param mixed $value
106
     * @param string $indent
107
     * @return $this
108
     */
109 4
    protected function processMessage($key, $value, $indent)
110
    {
111 4
        $row = '- ';
112
113 4
        if (!is_int($key)) {
114 4
            $row .= $key . ':';
115 4
        }
116
117 4
        if (is_array($value)) {
118 2
            $indent .= '    ';
119 2
            $this->message .= $row . PHP_EOL;
120 2
            $this->buildMessage($value, $indent);
121 2
        } else {
122 4
            $this->message .= $indent
123
                . $row
124 4
                . (!$key ? '' : ' ')
125 4
                . $value
126 4
                . PHP_EOL;
127
        }
128
129 4
        return $this;
130
    }
131
132
    /**
133
     * @return string
134
     */
135 18
    public function getMessage()
136
    {
137 18
        return $this->message;
138
    }
139
}
140