UIValidationEngine   A
last analyzed

Complexity

Total Complexity 9

Size/Duplication

Total Lines 79
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 3

Test Coverage

Coverage 100%

Importance

Changes 0
Metric Value
wmc 9
lcom 1
cbo 3
dl 0
loc 79
rs 10
c 0
b 0
f 0
ccs 20
cts 20
cp 1

7 Methods

Rating   Name   Duplication   Size   Complexity  
A initialize() 0 4 1
A guardAgainstAnyUIValidationException() 0 11 2
A validateFieldValue() 0 12 2
A __destruct() 0 4 1
A __construct() 0 4 1
A addUIValidationException() 0 7 1
A resetCommandResolverCollectionExceptions() 0 4 1
1
<?php
2
declare(strict_types = 1);
3
4
namespace Imedia\Ammit\UI\Resolver;
5
6
use Imedia\Ammit\UI\Resolver\Exception\UIValidationCollectionException;
7
use Imedia\Ammit\UI\Resolver\Exception\UIValidationException;
8
use Imedia\Ammit\UI\Resolver\Validator\InvalidArgumentException;
9
use Imedia\Ammit\UI\Resolver\Validator\UIValidatorInterface;
10
11
/**
12
 * @author Guillaume MOREL <[email protected]>
13
 */
14
class UIValidationEngine
15
{
16
    /** @var UIValidationException[] */
17
    private $interceptedUIValidationExceptions = [];
18
19
    /**
20
     * Restart the state of the UIValidationEngine
21
     * Clear all already intercepted UI Validation exceptions
22
     *
23
     * @return UIValidationEngine
24
     */
25
    public static function initialize(): UIValidationEngine
26
    {
27 1
        return new static();
28
    }
29
30
    /**
31
     * @throws UIValidationCollectionException
32
     */
33
    public function guardAgainstAnyUIValidationException()
34
    {
35 1
        if (count($this->interceptedUIValidationExceptions) > 0) {
36 1
            $exceptions = $this->interceptedUIValidationExceptions;
37 1
            $this->resetCommandResolverCollectionExceptions();
38
39 1
            throw new UIValidationCollectionException(
40
                $exceptions
41
            );
42
        }
43 1
    }
44
45
    /**
46
     * Validate if request field value is legit to be given to a Command
47
     * Catch UIValidationException in order to be able to process them later
48
     *
49
     * @param UIValidatorInterface $UIValidator
50
     * @param \Closure $validationFunction
51
     * @throws UIValidationException
52
     */
53
    public function validateFieldValue(UIValidatorInterface $UIValidator, \Closure $validationFunction)
54
    {
55
        try {
56 1
            $validationFunction->call($this);
57 1
        } catch (InvalidArgumentException $exception) {
58 1
            $this->addUIValidationException(
59
                $UIValidator,
60 1
                $exception->getMessage(),
61 1
                $exception->getPropertyPath()
62
            );
63
        }
64 1
    }
65
66
    /**
67
     * [DX] If developer forgot to call validateFieldValue()
68
     * @inheritDoc
69
     */
70
    public function __destruct()
71
    {
72 1
        $this->guardAgainstAnyUIValidationException();
73 1
    }
74
75
    private function __construct()
76
    {
77 1
        $this->resetCommandResolverCollectionExceptions();
78 1
    }
79
80
    private function addUIValidationException(UIValidatorInterface $uiValidator, string $message, string $propertyPath)
81
    {
82 1
        $this->interceptedUIValidationExceptions[] = $uiValidator->createUIValidationException(
83
            $message,
84
            $propertyPath
85
        );
86 1
    }
87
88
    private function resetCommandResolverCollectionExceptions()
89
    {
90 1
        $this->interceptedUIValidationExceptions = [];
91 1
    }
92
}
93