in graphql-dgs/src/main/kotlin/com/netflix/graphql/dgs/internal/DefaultInputObjectMapper.kt [91:122]
override fun <T : Any> mapToKotlinObject(
inputMap: Map<String, *>,
targetClass: KClass<T>,
): T {
val constructor =
targetClass.primaryConstructor
?: throw DgsInvalidInputArgumentException("No primary constructor found for class $targetClass")
val parameters = constructor.parameters
val parametersByName = CollectionUtils.newLinkedHashMap<KParameter, Any?>(parameters.size)
for (parameter in parameters) {
if (parameter.name !in inputMap) {
if (parameter.isOptional) {
continue
} else if (parameter.type.isMarkedNullable) {
parametersByName[parameter] = null
continue
}
throw DgsInvalidInputArgumentException("No value specified for required parameter ${parameter.name} of class $targetClass")
}
val input = inputMap[parameter.name]
parametersByName[parameter] = maybeConvert(input, parameter.type)
}
return try {
constructor.callBy(parametersByName)
} catch (ex: Exception) {
throw DgsInvalidInputArgumentException("Provided input arguments do not match arguments of data class `$targetClass`", ex)
}
}