Code Coverage
 
Lines
Branches
Paths
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
18 / 18
100.00% covered (success)
100.00%
12 / 12
100.00% covered (success)
100.00%
9 / 9
100.00% covered (success)
100.00%
6 / 6
CRAP
100.00% covered (success)
100.00%
1 / 1
Review
100.00% covered (success)
100.00%
18 / 18
100.00% covered (success)
100.00%
12 / 12
100.00% covered (success)
100.00%
9 / 9
100.00% covered (success)
100.00%
6 / 6
10
100.00% covered (success)
100.00%
1 / 1
 __construct
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 addError
100.00% covered (success)
100.00%
4 / 4
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 isList
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 values
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 path
100.00% covered (success)
100.00%
7 / 7
100.00% covered (success)
100.00%
7 / 7
100.00% covered (success)
100.00%
4 / 4
100.00% covered (success)
100.00%
1 / 1
4
 normalizePath
100.00% covered (success)
100.00%
4 / 4
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
2
1<?php
2
3declare(strict_types=1);
4
5namespace Celemas\Sire;
6
7/** @api */
8final readonly class Review
9{
10    public function __construct(
11        private ErrorBag $errors,
12        private array $values,
13        private bool $list,
14    ) {}
15
16    /**
17     * @param string|int|list<string|int> $path
18     * @param array<string, mixed> $params
19     */
20    public function addError(
21        string|int|array $path,
22        string $message,
23        string $code = 'custom',
24        array $params = [],
25    ): void {
26        $this->errors->add(
27            self::path($path),
28            new Issue([], $code, $message, $params),
29        );
30    }
31
32    public function isList(): bool
33    {
34        return $this->list;
35    }
36
37    /** @return array<array-key, mixed> */
38    public function values(): array
39    {
40        return $this->values;
41    }
42
43    /**
44     * @param string|int|list<string|int> $path
45     * @return list<string|int>
46     */
47    private static function path(string|int|array $path): array
48    {
49        if (is_int($path)) {
50            return [$path];
51        }
52
53        if (is_string($path)) {
54            if ($path === '') {
55                return [];
56            }
57
58            return self::normalizePath(explode('.', $path));
59        }
60
61        return $path;
62    }
63
64    /**
65     * @param list<string> $path
66     * @return list<string|int>
67     */
68    private static function normalizePath(array $path): array
69    {
70        return array_map(
71            static fn(string $part): string|int => ctype_digit($part) ? (int) $part : $part,
72            $path,
73        );
74    }
75}