Passed
Push — master ( a626ba...b864c0 )
by Zaahid
15:44 queued 12:03
created

ErrorBag::addError()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 14
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 13
CRAP Score 1

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 9
c 1
b 0
f 0
dl 0
loc 14
ccs 13
cts 13
cp 1
rs 9.9666
cc 1
nc 1
nop 3
crap 1
1
<?php
2
/**
3
 * This file is part of the ZBateson\MailMimeParser project.
4
 *
5
 * @license http://opensource.org/licenses/bsd-license.php BSD
6
 */
7
8
namespace ZBateson\MailMimeParser;
9
10
use Psr\Log\LoggerInterface;
11
use Psr\Log\LogLevel;
12
use Throwable;
13
14
/**
15
 * Provides a top-level abstract implementation of IErrorBag.
16
 *
17
 * @author Zaahid Bateson
18
 */
19
abstract class ErrorBag implements IErrorBag
20
{
21
    protected LoggerInterface $logger;
22
23
    /**
24
     * @var Error[] array of Error objects belonging to this object.
25
     */
26
    private array $errors = [];
27
28
    /**
29
     * @var bool true once the object has been validated.
30
     */
31
    private bool $validated = false;
32
33 113
    public function __construct(LoggerInterface $logger)
34
    {
35 113
        $this->logger = $logger;
36
    }
37
38
    /**
39
     * Returns the class name.  Override to identify objects in logs.
40
     *
41
     */
42 6
    public function getErrorLoggingContextName() : string
43
    {
44 6
        return static::class;
45
    }
46
47
    /**
48
     * Return any children ErrorBag objects.
49
     *
50
     * @return IErrorBag[]
51
     */
52
    abstract protected function getErrorBagChildren() : array;
53
54
    /**
55
     * Perform any extra validation and call 'addError'.
56
     *
57
     * getErrors and getAllErrors call validate() if their $validate parameter
58
     * is true.  validate() is only called once on an object with getErrors
59
     * getAllErrors.
60
     */
61
    protected function validate() : void
62
    {
63
        // do nothing
64
    }
65
66 78
    public function addError(string $message, string $psrLogLevel, ?Throwable $exception = null) : static
67
    {
68 78
        $error = new Error($message, $psrLogLevel, $this, $exception);
69 78
        $this->errors[] = $error;
70 78
        $this->logger->log(
71 78
            $psrLogLevel,
72 78
            '{contextName} {message} {exception}',
73 78
            [
74 78
                'contextName' => $this->getErrorLoggingContextName(),
75 78
                'message' => $message,
76 78
                'exception' => $exception ?? ''
77 78
            ]
78 78
        );
79 78
        return $this;
80
    }
81
82 5
    public function getErrors(bool $validate = false, string $minPsrLevel = LogLevel::ERROR) : array
83
    {
84 5
        if ($validate && !$this->validated) {
85
            $this->validated = true;
86
            $this->validate();
87
        }
88 5
        return \array_values(\array_filter(
89 5
            $this->errors,
90 5
            function($e) use ($minPsrLevel) {
0 ignored issues
show
Coding Style introduced by
Expected 1 space after FUNCTION keyword; 0 found
Loading history...
91 5
                return $e->isPsrLevelGreaterOrEqualTo($minPsrLevel);
92 5
            }
93 5
        ));
94
    }
95
96 4
    public function hasErrors(bool $validate = false, string $minPsrLevel = LogLevel::ERROR) : bool
97
    {
98 4
        return (\count($this->getErrors($validate, $minPsrLevel)) > 0);
99
    }
100
101 3
    public function getAllErrors(bool $validate = false, string $minPsrLevel = LogLevel::ERROR) : array
102
    {
103 3
        $arr = \array_values(\array_map(
104 3
            function($e) use ($validate, $minPsrLevel) {
0 ignored issues
show
Coding Style introduced by
Expected 1 space after FUNCTION keyword; 0 found
Loading history...
105 3
                return $e->getAllErrors($validate, $minPsrLevel) ?? [];
106 3
            },
107 3
            $this->getErrorBagChildren()
108 3
        )) ?? [];
109 3
        return \array_merge($this->getErrors($validate, $minPsrLevel), ...$arr);
110
    }
111
112 2
    public function hasAnyErrors(bool $validate = false, string $minPsrLevel = LogLevel::ERROR) : bool
113
    {
114 2
        if ($this->hasErrors($validate, $minPsrLevel)) {
115 2
            return true;
116
        }
117 2
        foreach ($this->getErrorBagChildren() as $ch) {
118 2
            if ($ch->hasAnyErrors($validate, $minPsrLevel)) {
119
                return true;
120
            }
121
        }
122 2
        return false;
123
    }
124
}
125