OrSpecification::validate()   A
last analyzed

Complexity

Conditions 3
Paths 3

Size

Total Lines 23
Code Lines 16

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 3
eloc 16
nc 3
nop 0
dl 0
loc 23
rs 9.0856
c 0
b 0
f 0
1
<?php
2
3
namespace BenTools\Specification\Logical;
4
5
use BenTools\Specification\Exception\UnmetSpecificationException;
6
use BenTools\Specification\Specification;
7
8
final class OrSpecification extends Specification
9
{
10
    /**
11
     * @var Specification
12
     */
13
    private $leftSpecification;
14
15
    /**
16
     * @var Specification
17
     */
18
    private $rightSpecification;
19
20
21
    /**
22
     * OrSpecification constructor.
23
     *
24
     * @param Specification $leftSpecification
25
     * @param Specification $rightSpecification
26
     * @param null|string   $name
27
     */
28
    protected function __construct(
29
        Specification $leftSpecification,
30
        Specification $rightSpecification,
31
        ?string $name
32
    ) {
33
    
34
35
        $this->leftSpecification = $leftSpecification;
36
        $this->rightSpecification = $rightSpecification;
37
        $this->label = $name;
38
    }
39
40
    /**
41
     * @inheritDoc
42
     */
43
    public function validate(): void
44
    {
45
        $rejection = new UnmetSpecificationException();
46
        $leftSpecification = $this->leftSpecification;
47
        $rightSpecification = $this->rightSpecification;
48
49
        try {
50
            $leftSpecification->validate();
51
        } catch (UnmetSpecificationException $leftException) {
52
            try {
53
                $rightSpecification->validate();
54
            } catch (UnmetSpecificationException $rightException) {
55
                $rejection = $rejection->withUnmetSpecifications(
56
                    ...array_merge(
57
                        [$this],
58
                        $leftException->getUnmetSpecifications(),
59
                        $rightException->getUnmetSpecifications()
60
                    )
61
                );
62
                $rejection->throwIfUnmet();
63
            }
64
        }
65
    }
66
}
67