99use GraphQL \SchemaGenerator \CodeGenerator \InputObjectClassBuilder ;
1010use GraphQL \SchemaGenerator \CodeGenerator \ObjectBuilderInterface ;
1111use GraphQL \SchemaGenerator \CodeGenerator \QueryObjectClassBuilder ;
12+ use GraphQL \SchemaGenerator \CodeGenerator \UnionObjectBuilder ;
1213use GraphQL \SchemaObject \QueryObject ;
1314use GraphQL \Util \StringLiteralFormatter ;
1415use RuntimeException ;
@@ -118,7 +119,7 @@ private function appendQueryObjectFields(QueryObjectClassBuilder $queryObjectBui
118119 if ($ argsObjectGenerated ) {
119120
120121 // Add sub type as a field to the query object if all generation happened successfully
121- $ queryObjectBuilder ->addObjectField ($ name , $ typeName , $ argsObjectName , $ fieldArray ['isDeprecated ' ], $ fieldArray ['deprecationReason ' ]);
122+ $ queryObjectBuilder ->addObjectField ($ name , $ typeName , $ typeKind , $ argsObjectName , $ fieldArray ['isDeprecated ' ], $ fieldArray ['deprecationReason ' ]);
122123 }
123124 }
124125 }
@@ -140,6 +141,8 @@ protected function generateObject(string $objectName, string $objectKind): bool
140141 return $ this ->generateInputObject ($ objectName );
141142 case FieldTypeKindEnum::ENUM_OBJECT :
142143 return $ this ->generateEnumObject ($ objectName );
144+ case FieldTypeKindEnum::UNION_OBJECT :
145+ return $ this ->generateUnionObject ($ objectName );
143146 default :
144147 print "Couldn't generate type $ objectName: generating $ objectKind kind is not supported yet " . PHP_EOL ;
145148 return false ;
@@ -229,7 +232,7 @@ protected function generateEnumObject(string $objectName): bool
229232 $ objectArray = $ this ->schemaInspector ->getEnumObjectSchema ($ objectName );
230233 $ objectName = $ objectArray ['name ' ];
231234 $ objectBuilder = new EnumObjectBuilder ($ this ->writeDir , $ objectName , $ this ->generationNamespace );
232-
235+
233236 foreach ($ objectArray ['enumValues ' ] as $ enumValue ) {
234237 $ name = $ enumValue ['name ' ];
235238 //$description = $enumValue['description'];
@@ -240,6 +243,32 @@ protected function generateEnumObject(string $objectName): bool
240243 return true ;
241244 }
242245
246+ /**
247+ * @param string $objectName
248+ *
249+ * @return bool
250+ */
251+ protected function generateUnionObject (string $ objectName ): bool
252+ {
253+ if (array_key_exists ($ objectName , $ this ->generatedObjects )) {
254+ return true ;
255+ }
256+
257+ $ this ->generatedObjects [$ objectName ] = true ;
258+
259+ $ objectArray = $ this ->schemaInspector ->getUnionObjectSchema ($ objectName );
260+ $ objectName = $ objectArray ['name ' ];
261+ $ objectBuilder = new UnionObjectBuilder ($ this ->writeDir , $ objectName , $ this ->generationNamespace );
262+
263+ foreach ($ objectArray ['possibleTypes ' ] as $ possibleType ) {
264+ $ this ->generateObject ($ possibleType ['name ' ], $ possibleType ['kind ' ]);
265+ $ objectBuilder ->addPossibleType ($ possibleType ['name ' ]);
266+ }
267+ $ objectBuilder ->build ();
268+
269+ return true ;
270+ }
271+
243272 /**
244273 * @param string $argsObjectName
245274 * @param array $arguments
@@ -255,7 +284,7 @@ protected function generateArgumentsObject(string $argsObjectName, array $argume
255284 $ this ->generatedObjects [$ argsObjectName ] = true ;
256285
257286 $ objectBuilder = new ArgumentsObjectClassBuilder ($ this ->writeDir , $ argsObjectName , $ this ->generationNamespace );
258-
287+
259288 foreach ($ arguments as $ argumentArray ) {
260289 $ name = $ argumentArray ['name ' ];
261290 //$description = $inputFieldArray['description'];
0 commit comments