1010use Orisai \ObjectMapper \Exception \InvalidData ;
1111use Orisai \ObjectMapper \Exception \ValueDoesNotMatch ;
1212use Orisai \ObjectMapper \Meta \Compile \RuleCompileMeta ;
13+ use Orisai \ObjectMapper \PhpTypes \MultiValueNode ;
1314use Orisai \ObjectMapper \PhpTypes \Node ;
14- use Orisai \ObjectMapper \PhpTypes \SimpleNode ;
1515use Orisai \ObjectMapper \Types \ArrayType ;
1616use Orisai \ObjectMapper \Types \Value ;
1717use Orisai \Utils \Arrays \ArrayMerger ;
@@ -79,7 +79,7 @@ public function getArgsType(): string
7979 }
8080
8181 /**
82- * @param mixed $value
82+ * @param mixed $value
8383 * @param ArrayOfArgs $args
8484 * @return array<mixed>
8585 * @throws ValueDoesNotMatch
@@ -165,14 +165,10 @@ public function processValue($value, Args $args, FieldContext $context): array
165165 */
166166 public function createType (Args $ args , TypeContext $ context ): ArrayType
167167 {
168- $ itemMeta = $ args ->itemRuleMeta ;
169- $ itemRule = $ context ->getRule ($ itemMeta ->getType ());
170- $ itemArgs = $ itemMeta ->getArgs ();
168+ [$ keyRule , $ keyArgs ] = $ this ->getKeyRuleArgs ($ args , $ context );
169+ [$ itemRule , $ itemArgs ] = $ this ->getItemRuleArgs ($ args , $ context );
171170
172- $ keyMeta = $ args ->keyRuleMeta ;
173- if ($ keyMeta !== null ) {
174- $ keyRule = $ context ->getRule ($ keyMeta ->getType ());
175- $ keyArgs = $ keyMeta ->getArgs ();
171+ if ($ keyRule !== null && $ keyArgs !== null ) {
176172 $ keyType = $ keyRule ->createType ($ keyArgs , $ context );
177173 }
178174
@@ -197,15 +193,59 @@ public function createType(Args $args, TypeContext $context): ArrayType
197193 */
198194 public function getExpectedInputType (Args $ args , TypeContext $ context ): Node
199195 {
200- return new SimpleNode ('TODO ' );
196+ [$ keyRule , $ keyArgs ] = $ this ->getKeyRuleArgs ($ args , $ context );
197+ [$ itemRule , $ itemArgs ] = $ this ->getItemRuleArgs ($ args , $ context );
198+
199+ if ($ keyRule !== null && $ keyArgs !== null ) {
200+ $ keyNode = $ keyRule ->getExpectedInputType ($ keyArgs , $ context );
201+ }
202+
203+ return new MultiValueNode (
204+ $ this ->getNodeName ($ args ),
205+ $ keyNode ?? null ,
206+ $ itemRule ->getExpectedInputType ($ itemArgs , $ context ),
207+ );
201208 }
202209
203210 /**
204211 * @param ArrayOfArgs $args
205212 */
206213 public function getReturnType (Args $ args , TypeContext $ context ): Node
207214 {
208- return new SimpleNode ('TODO ' );
215+ [$ keyRule , $ keyArgs ] = $ this ->getKeyRuleArgs ($ args , $ context );
216+ [$ itemRule , $ itemArgs ] = $ this ->getItemRuleArgs ($ args , $ context );
217+
218+ if ($ keyRule !== null && $ keyArgs !== null ) {
219+ $ keyNode = $ keyRule ->getReturnType ($ keyArgs , $ context );
220+ }
221+
222+ return new MultiValueNode (
223+ $ this ->getNodeName ($ args ),
224+ $ keyNode ?? null ,
225+ $ itemRule ->getReturnType ($ itemArgs , $ context ),
226+ );
227+ }
228+
229+ private function getNodeName (ArrayOfArgs $ args ): string
230+ {
231+ return ($ args ->minItems ?? 0 ) > 0 ? 'non-empty-array ' : 'array ' ;
232+ }
233+
234+ /**
235+ * @return array{Rule<Args>, Args}|array{null, null}
236+ */
237+ private function getKeyRuleArgs (ArrayOfArgs $ args , TypeContext $ context ): array
238+ {
239+ $ keyRuleMeta = $ args ->keyRuleMeta ;
240+
241+ if ($ keyRuleMeta === null ) {
242+ return [null , null ];
243+ }
244+
245+ $ keyRule = $ context ->getRule ($ keyRuleMeta ->getType ());
246+ $ keyArgs = $ keyRuleMeta ->getArgs ();
247+
248+ return [$ keyRule , $ keyArgs ];
209249 }
210250
211251}
0 commit comments