AndSpecification::validate()   B
last analyzed

Complexity

Conditions 3
Paths 4

Size

Total Lines 26
Code Lines 17

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 3
eloc 17
nc 4
nop 0
dl 0
loc 26
rs 8.8571
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 AndSpecification extends Specification
9
{
10
11
    /**
12
     * @var Specification
13
     */
14
    private $leftSpecification;
15
16
    /**
17
     * @var Specification
18
     */
19
    private $rightSpecification;
20
21
22
    /**
23
     * AndSpecification constructor.
24
     *
25
     * @param Specification $leftSpecification
26
     * @param Specification $rightSpecification
27
     * @param null|string   $name
28
     */
29
    protected function __construct(
30
        Specification $leftSpecification,
31
        Specification $rightSpecification,
32
        ?string $name
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 $e) {
52
            $rejection = $rejection->withUnmetSpecifications($this)
53
                ->withUnmetSpecifications(
54
                    ...$e->getUnmetSpecifications()
55
                );
56
        }
57
58
        try {
59
            $rightSpecification->validate();
60
        } catch (UnmetSpecificationException $e) {
61
            $rejection = $rejection->withUnmetSpecifications($this)
62
                ->withUnmetSpecifications(
63
                    ...$e->getUnmetSpecifications()
64
                );
65
        }
66
67
        $rejection->throwIfUnmet();
68
    }
69
}
70