Skip to content

Commit 70c60ae

Browse files
committed
Improve messages in an array format
1 parent 1915b6f commit 70c60ae

File tree

3 files changed

+131
-21
lines changed

3 files changed

+131
-21
lines changed

library/Message/StandardFormatter.php

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -106,42 +106,42 @@ public function array(Result $result, array $templates, Translator $translator):
106106
{
107107
$selectedTemplates = $this->selectTemplates($result, $templates);
108108
$deduplicatedChildren = $this->extractDeduplicatedChildren($result);
109-
if (count($deduplicatedChildren) === 0 || $this->isFinalTemplate($result, $selectedTemplates)) {
110-
return [
111-
$result->getDeepestPath() ?? $result->id => $this->renderer->render(
112-
$this->getTemplated($result->withDeepestPath(), $selectedTemplates),
109+
$messages = [
110+
'messages' => [
111+
$result->id => $this->renderer->render(
112+
$this->getTemplated($result, $selectedTemplates)->withWithoutPath(),
113113
$translator
114114
),
115-
];
116-
}
117-
118-
$messages = [];
115+
],
116+
'details' => [],
117+
'children' => [],
118+
];
119119
foreach ($deduplicatedChildren as $child) {
120+
if ($child->path === null) {
121+
$messages['details'][$child->id] = $this->renderer->render(
122+
$this->getTemplated($child, $selectedTemplates)->withWithoutPath(),
123+
$translator
124+
);
125+
continue;
126+
}
120127
$key = $child->getDeepestPath() ?? $child->id;
121-
$messages[$key] = $this->array(
128+
$messages['children'][$key] = $this->array(
122129
$this->resultWithPath($result, $child),
123130
$this->selectTemplates($child, $selectedTemplates),
124131
$translator
125132
);
126-
if (count($messages[$key]) !== 1) {
133+
if (count($messages['children'][$key]) !== 1) {
127134
continue;
128135
}
129136

130-
$messages[$key] = current($messages[$key]);
137+
$messages['children'][$key] = current($messages['children'][$key]);
131138
}
132139

133-
if (count($messages) > 1) {
134-
$self = [
135-
'__root__' => $this->renderer->render(
136-
$this->getTemplated($result->withDeepestPath(), $selectedTemplates),
137-
$translator
138-
),
139-
];
140-
141-
return $self + $messages;
140+
if ($result->path !== null) {
141+
return [$result->getDeepestPath() => array_filter($messages)];
142142
}
143143

144-
return $messages;
144+
return array_filter($messages);
145145
}
146146

147147
public function resultWithPath(Result $parent, Result $child): Result

library/Result.php

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,23 @@ public function withDeepestPath(): self
132132
);
133133
}
134134

135+
public function withWithoutPath(): self
136+
{
137+
return new self(
138+
$this->isValid,
139+
$this->input,
140+
$this->rule,
141+
$this->parameters,
142+
$this->template,
143+
$this->mode,
144+
$this->name,
145+
$this->id,
146+
$this->adjacent?->withWithoutPath(),
147+
null,
148+
...$this->children
149+
);
150+
}
151+
135152
public function getDeepestPath(): ?string
136153
{
137154
if ($this->path === null) {
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
<?php
2+
3+
/*
4+
* Copyright (c) Alexandre Gomes Gaigalas <[email protected]>
5+
* SPDX-License-Identifier: MIT
6+
*/
7+
8+
declare(strict_types=1);
9+
10+
test('https://github.com/Respect/Validation/discussions/1427', expectAll(
11+
fn () => v::each(
12+
v::arrayVal()
13+
->key('groups', v::each(v::intVal()))
14+
->key('permissions', v::each(v::boolVal()))
15+
)
16+
->assert([
17+
16 => [
18+
'groups' => [1, 'A', 3, 4, 5],
19+
'permissions' => [
20+
'perm1' => true,
21+
'perm2' => false,
22+
'perm3' => 'boom!',
23+
],
24+
],
25+
18 => false,
26+
24 => ['permissions' => false],
27+
]),
28+
'`.16.groups.1` must be an integer value',
29+
<<<'FULL_MESSAGE'
30+
- Each item in `[16: ["groups": [1, "A", 3, 4, 5], "permissions": ["perm1": true, "perm2": false, "perm3": "boom!"]], 18: false, ... ]` must be valid
31+
- `.16` must pass the rules
32+
- Each item in `.groups` must be valid
33+
- `.1` must be an integer value
34+
- Each item in `.permissions` must be valid
35+
- `.perm3` must be a boolean value
36+
- `.18` must pass all the rules
37+
- `.18` must be an array value
38+
- `.groups` must be present
39+
- `.permissions` must be present
40+
- `.24` must pass the rules
41+
- `.groups` must be present
42+
- `.permissions` must be iterable
43+
FULL_MESSAGE,
44+
[
45+
'messages' => ['each' => 'Each item in `[16: ["groups": [1, "A", 3, 4, 5], "permissions": ["perm1": true, "perm2": false, "perm3": "boom!"]], 18: false, ... ]` must be valid'],
46+
'children' => [
47+
16 => [
48+
'messages' => ['allOf' => '`["groups": [1, "A", 3, 4, 5], "permissions": ["perm1": true, "perm2": false, "perm3": "boom!"]]` must pass the rules'],
49+
'children' => [
50+
'groups' => [
51+
'messages' => ['each' => 'Each item in `[1, "A", 3, 4, 5]` must be valid'],
52+
'children' => [
53+
1 => [
54+
'messages' => ['intVal' => '"A" must be an integer value'],
55+
],
56+
],
57+
],
58+
'permissions' => [
59+
'messages' => ['each' => 'Each item in `["perm1": true, "perm2": false, "perm3": "boom!"]` must be valid'],
60+
'children' => [
61+
'perm3' => [
62+
'messages' => ['boolVal' => '"boom!" must be a boolean value'],
63+
],
64+
],
65+
],
66+
],
67+
],
68+
18 => [
69+
'messages' => ['allOf' => '`false` must pass all the rules'],
70+
'details' => ['arrayVal' => '`false` must be an array value'],
71+
'children' => [
72+
'groups' => [
73+
'messages' => ['keyExists' => '`false` must be present'],
74+
],
75+
'permissions' => [
76+
'messages' => ['keyExists' => '`false` must be present'],
77+
],
78+
],
79+
],
80+
24 => [
81+
'messages' => ['allOf' => '`["permissions": false]` must pass the rules'],
82+
'children' => [
83+
'groups' => [
84+
'messages' => ['keyExists' => '`["permissions": false]` must be present'],
85+
],
86+
'permissions' => [
87+
'messages' => ['each' => '`false` must be iterable'],
88+
],
89+
],
90+
],
91+
],
92+
]
93+
));

0 commit comments

Comments
 (0)