ValidationResult   A
last analyzed

Complexity

Total Complexity 19

Size/Duplication

Total Lines 128
Duplicated Lines 0 %

Test Coverage

Coverage 100%

Importance

Changes 4
Bugs 0 Features 1
Metric Value
eloc 24
c 4
b 0
f 1
dl 0
loc 128
ccs 32
cts 32
cp 1
rs 10
wmc 19

11 Methods

Rating   Name   Duplication   Size   Complexity  
A isSuccess() 0 3 1
A getErrors() 0 3 1
A success() 0 3 1
A succeeded() 0 3 1
A getError() 0 7 3
A add() 0 6 4
A mustSucceed() 0 4 2
A translate() 0 3 2
A error() 0 6 1
A failed() 0 3 1
A addError() 0 8 2
1
<?php
2
3
namespace Jasny;
4
5
/**
6
 * Validation result
7
 */
8
class ValidationResult
9
{
10
    /**
11
     * Callback for translating the error message
12
     * @var callable|null
13
     */
14
    public static $translate;
15
16
17
    /**
18
     * @var string[]
19
     */
20
    protected array $errors = [];
21
22
23
    /**
24
     * Translate a message
25
     */
26 14
    public function translate(string $message): string
27
    {
28 14
        return isset(static::$translate) ? (static::$translate)($message) : $message;
29
    }
30
31
    /**
32
     * Add an error
33
     *
34
     * @param string $message
35
     * @param mixed  ...$args  Arguments to insert into the message
36
     */
37 14
    public function addError(string $message, mixed ...$args): void
38
    {
39 14
        $message = $this->translate($message);
40 14
        if (!empty($args)) {
41 3
            $message = vsprintf($message, $args);
42
        }
43
44 14
        $this->errors[] = $message;
45
    }
46
47
    /**
48
     * Add errors from a validation object
49
     */
50 3
    public function add(ValidationResult $validation, ?string $prefix = null): void
51
    {
52 3
        $prefix = $prefix !== null ? $this->translate($prefix) : null;
53
54 3
        foreach ($validation->getErrors() as $err) {
55 3
            $this->errors[] = ($prefix ? trim($prefix) . ' ' : '') . $err;
56
        }
57
    }
58
59
60
    /**
61
     * Check if there are no validation errors.
62
     */
63 1
    public function succeeded(): bool
64
    {
65 1
        return empty($this->errors);
66
    }
67
68
    /**
69
     * Alias of succeeded()
70
     */
71 1
    final public function isSuccess(): bool
72
    {
73 1
        return $this->succeeded();
74
    }
75
76
    /**
77
     * Check if there are validation errors
78
     */
79 3
    public function failed(): bool
80
    {
81 3
        return !empty($this->errors);
82
    }
83
84
85
    /**
86
     * Get the (first) validation error
87
     */
88 2
    public function getError(): ?string
89
    {
90 2
        if (count($this->errors) > 1) {
91 1
            trigger_error("There are multiple errors, returning only the first", E_USER_NOTICE);
92
        }
93
94 2
        return reset($this->errors) ?: null;
95
    }
96
97
    /**
98
     * Get the validation errors
99
     *
100
     * @return string[]
101
     */
102 11
    public function getErrors(): array
103
    {
104 11
        return $this->errors;
105
    }
106
107
108
    /**
109
     * Throw a validation exception if there are any errors
110
     */
111 2
    public function mustSucceed(): void
112
    {
113 2
        if ($this->failed()) {
114 1
            throw new ValidationException($this);
115
        }
116
    }
117
118
119
    /**
120
     * Factory method for successful validation
121
     */
122 1
    public static function success(): static
123
    {
124 1
        return new static();
125
    }
126
127
    /**
128
     * Factory method for failed validation
129
     */
130 2
    public static function error(string $message, mixed ...$args): static
131
    {
132 2
        $validation = new static();
133 2
        $validation->addError($message, ...$args);
134
135 2
        return $validation;
136
    }
137
}
138