Passed
Pull Request — master (#73)
by Rustam
02:17
created

Message::level()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 2
CRAP Score 1

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 1
nc 1
nop 0
dl 0
loc 3
ccs 2
cts 2
cp 1
crap 1
rs 10
c 1
b 0
f 0
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Yiisoft\Log;
6
7
use Psr\Log\InvalidArgumentException;
8
use Psr\Log\LoggerTrait;
9
use Psr\Log\LogLevel;
10
use Stringable;
11
12
use function preg_replace_callback;
13
14
/**
15
 * Message is a data object that stores log message data.
16
 */
17
final class Message
18
{
19
    /**
20
     * @var string Log message level.
21
     *
22
     * @see LogLevel See constants for valid level names.
23
     */
24
    private string $level;
25
26
    /**
27
     * @var string Log message.
28
     */
29
    private string $message;
30
31
    /**
32
     * @var array Log message context.
33
     *
34
     * Message context has a following keys:
35
     *
36
     * - category: string, message category.
37
     * - memory: int, memory usage in bytes, obtained by `memory_get_usage()`.
38
     * - time: float, message timestamp obtained by microtime(true).
39
     * - trace: array, debug backtrace, contains the application code call stacks.
40
     */
41
    private array $context;
42
43
    /**
44
     * @param mixed $level Log message level.
45
     * @param string|Stringable $message Log message.
46
     * @param array $context Log message context.
47
     *
48
     * @throws InvalidArgumentException for invalid log message level.
49
     *
50
     * @see LoggerTrait::log()
51
     * @see LogLevel
52
     */
53 134
    public function __construct(mixed $level, string|Stringable $message, array $context = [])
54
    {
55 134
        $this->level = Logger::validateLevel($level);
56 133
        $this->message = $this->parse($message, $context);
57 133
        $this->context = $context;
58
    }
59
60
    /**
61
     * Gets a log message level.
62
     *
63
     * @return string Log message level.
64
     */
65 88
    public function level(): string
66
    {
67 88
        return $this->level;
68
    }
69
70
    /**
71
     * Gets a log message.
72
     *
73
     * @return string Log message.
74
     */
75 97
    public function message(): string
76
    {
77 97
        return $this->message;
78
    }
79
80
    /**
81
     * Returns a value of the context parameter for the specified name.
82
     *
83
     * If no name is specified, the entire context is returned.
84
     *
85
     * @param string|null $name The context parameter name.
86
     * @param mixed $default If the context parameter does not exist, the `$default` will be returned.
87
     *
88
     * @return mixed The context parameter value.
89
     */
90 116
    public function context(string $name = null, mixed $default = null): mixed
91
    {
92 116
        if ($name === null) {
93 50
            return $this->context;
94
        }
95
96 115
        return $this->context[$name] ?? $default;
97
    }
98
99
    /**
100
     * Parses log message resolving placeholders in the form: "{foo}",
101
     * where foo will be replaced by the context data in key "foo".
102
     *
103
     * @param string|Stringable $message Raw log message.
104
     * @param array $context Message context.
105
     *
106
     * @return string Parsed message.
107
     */
108 133
    private function parse(string|Stringable $message, array $context): string
109
    {
110 133
        $message = (string)$message;
111
112 133
        return preg_replace_callback('/{([\w.]+)}/', static function (array $matches) use ($context) {
113 4
            $placeholderName = $matches[1];
114
115 4
            if (isset($context[$placeholderName])) {
116 2
                return (string) $context[$placeholderName];
117
            }
118
119 2
            return $matches[0];
120
        }, $message);
121
    }
122
}
123