coerceVariableValues method

Map<String, dynamic> coerceVariableValues(
  1. GraphQLSchema schema,
  2. OperationDefinitionContext operation,
  3. Map<String, dynamic> variableValues
)

Implementation

Map<String, dynamic> coerceVariableValues(
    GraphQLSchema schema,
    OperationDefinitionContext operation,
    Map<String, dynamic> variableValues) {
  var coercedValues = <String, dynamic>{};
  var variableDefinitions =
      operation.variableDefinitions?.variableDefinitions ?? [];

  for (var variableDefinition in variableDefinitions) {
    var variableName = variableDefinition.variable.name;
    var variableType = variableDefinition.type;
    var defaultValue = variableDefinition.defaultValue;

    //if (variableName == null) {
    //  continue;
    //}
    var value = variableValues[variableName];
    dynamic toSet;

    final jp = getDirectiveValue(
        'jsonpath', 'path', variableDefinition, variableValues);

    if (value == null) {
      if (defaultValue != null) {
        toSet = defaultValue.value.computeValue(variableValues);
      } else if (!variableType.isNullable && jp == null) {
        throw GraphQLException.fromSourceSpan(
            'Missing required variable "$variableName".',
            variableDefinition.span);
      }
    } else {
      var type = convertType(variableType);
      var validation = type.validate(variableName, value);

      if (!validation.successful) {
        throw GraphQLException(validation.errors
            .map((e) => GraphQLExceptionError(e, locations: [
                  GraphExceptionErrorLocation.fromSourceLocation(
                      variableDefinition.span.start)
                ]))
            .toList());
      } else {
        toSet = type.deserialize(value);
      }
    }

    if (jp != null) {
      toSet = JsonPathArgument(jp, variableDefinition, toSet, coercedValues);
    }

    coercedValues[variableName] = toSet;
  }

  return coercedValues;
}