@@ -32,9 +32,16 @@ public function getVisitor(QueryValidationContext $context): array
32
32
}
33
33
34
34
$ providedFields = [];
35
+ $ nullFields = [];
36
+
35
37
foreach ($ node ->fields as $ fieldNode ) {
36
38
$ fieldName = $ fieldNode ->name ->value ;
37
39
$ providedFields [] = $ fieldName ;
40
+
41
+ // Check if the field value is explicitly null
42
+ if ($ fieldNode ->value ->kind === NodeKind::NULL ) {
43
+ $ nullFields [] = $ fieldName ;
44
+ }
38
45
}
39
46
40
47
$ fieldCount = count ($ providedFields );
@@ -44,11 +51,26 @@ public function getVisitor(QueryValidationContext $context): array
44
51
static ::oneOfInputObjectExpectedExactlyOneFieldMessage ($ namedType ->name ),
45
52
[$ node ]
46
53
));
47
- } elseif ($ fieldCount > 1 ) {
54
+
55
+ return ;
56
+ }
57
+
58
+ if ($ fieldCount > 1 ) {
48
59
$ context ->reportError (new Error (
49
60
static ::oneOfInputObjectExpectedExactlyOneFieldMessage ($ namedType ->name , $ fieldCount ),
50
61
[$ node ]
51
62
));
63
+
64
+ return ;
65
+ }
66
+
67
+ // At this point, $fieldCount === 1
68
+ if (count ($ nullFields ) > 0 ) {
69
+ // Exactly one field provided, but it's null
70
+ $ context ->reportError (new Error (
71
+ static ::oneOfInputObjectFieldValueMustNotBeNullMessage ($ namedType ->name , $ nullFields [0 ]),
72
+ [$ node ]
73
+ ));
52
74
}
53
75
},
54
76
];
@@ -62,4 +84,9 @@ public static function oneOfInputObjectExpectedExactlyOneFieldMessage(string $ty
62
84
63
85
return "OneOf input object ' {$ typeName }' must specify exactly one field, but {$ providedCount } fields were provided. " ;
64
86
}
87
+
88
+ public static function oneOfInputObjectFieldValueMustNotBeNullMessage (string $ typeName , string $ fieldName ): string
89
+ {
90
+ return "OneOf input object ' {$ typeName }' field ' {$ fieldName }' must be non-null. " ;
91
+ }
65
92
}
0 commit comments