UIValidationEngine::validateFieldValue()   A
last analyzed

Complexity

Conditions 2
Paths 2

Size

Total Lines 12
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 6
CRAP Score 2

Importance

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