OrSpecification   A
last analyzed

Complexity

Total Complexity 4

Size/Duplication

Total Lines 59
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 2

Importance

Changes 0
Metric Value
dl 0
loc 59
rs 10
c 0
b 0
f 0
wmc 4
lcom 1
cbo 2

2 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 11 1
A validate() 0 23 3
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