private function prepareArgumentValue($argumentValue, AbstractType $argumentType, Request $request)
{
switch ($argumentType->getKind()) {
case TypeMap::KIND_LIST:
/** @var $argumentType AbstractListType */
$result = [];
if ($argumentValue instanceof AstInputList || is_array($argumentValue)) {
$list = is_array($argumentValue) ? $argumentValue : $argumentValue->getValue();
foreach ($list as $item) {
$result[] = $this->prepareArgumentValue($item, $argumentType->getItemType()->getNullableType(), $request);
}
} else {
if ($argumentValue instanceof VariableReference) {
return $this->getVariableReferenceArgumentValue($argumentValue, $argumentType, $request);
}
}
return $result;
case TypeMap::KIND_INPUT_OBJECT:
/** @var $argumentType AbstractInputObjectType */
$result = [];
if ($argumentValue instanceof AstInputObject) {
foreach ($argumentType->getFields() as $field) {
/** @var $field Field */
if ($field->getConfig()->has('default')) {
$result[$field->getName()] = $field->getConfig()->get('default');
}
}
foreach ($argumentValue->getValue() as $key => $item) {
if ($argumentType->hasField($key)) {
$result[$key] = $this->prepareArgumentValue($item, $argumentType->getField($key)->getType()->getNullableType(), $request);
} else {
$result[$key] = $item;
}
}
} else {
if ($argumentValue instanceof VariableReference) {
return $this->getVariableReferenceArgumentValue($argumentValue, $argumentType, $request);
}
}
return $result;
case TypeMap::KIND_SCALAR:
case TypeMap::KIND_ENUM:
/** @var $argumentValue AstLiteral|VariableReference */
if ($argumentValue instanceof VariableReference) {
return $this->getVariableReferenceArgumentValue($argumentValue, $argumentType, $request);
} else {
if ($argumentValue instanceof AstLiteral) {
return $argumentValue->getValue();
} else {
return $argumentValue;
}
}
}
throw new ResolveException('Argument type not supported');
}