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}

Paths

Below are the source code lines that represent each code path as identified by Xdebug. Please note a path is not necessarily coterminous with a line, a line may contain multiple paths and therefore show up more than once. Please also be aware that some paths may include implicit rather than explicit branches, e.g. an if statement always has an else as part of its logical flow even if you didn't write one.

Review->__construct
11        private ErrorBag $errors,
12        private array $values,
13        private bool $list,
14    ) {}
Review->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    }
Review->isList
34        return $this->list;
35    }
Review->normalizePath
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    }
Review->path
47    private static function path(string|int|array $path): array
48    {
49        if (is_int($path)) {
 
50            return [$path];
47    private static function path(string|int|array $path): array
48    {
49        if (is_int($path)) {
 
53        if (is_string($path)) {
 
54            if ($path === '') {
 
55                return [];
47    private static function path(string|int|array $path): array
48    {
49        if (is_int($path)) {
 
53        if (is_string($path)) {
 
54            if ($path === '') {
 
58            return self::normalizePath(explode('.', $path));
47    private static function path(string|int|array $path): array
48    {
49        if (is_int($path)) {
 
53        if (is_string($path)) {
 
61        return $path;
62    }
Review->values
40        return $this->values;
41    }
{closure:/workspace/celemas/sire/src/Review.php:71-71}
71            static fn(string $part): string|int => ctype_digit($part) ? (int) $part : $part,
 
71            static fn(string $part): string|int => ctype_digit($part) ? (int) $part : $part,
 
71            static fn(string $part): string|int => ctype_digit($part) ? (int) $part : $part,
71            static fn(string $part): string|int => ctype_digit($part) ? (int) $part : $part,
 
71            static fn(string $part): string|int => ctype_digit($part) ? (int) $part : $part,
 
71            static fn(string $part): string|int => ctype_digit($part) ? (int) $part : $part,