public IReadOnlyDictionary <NameString, ArgumentValue> CoerceArguments( IVariableValueCollection variables, ITypeConversion converter) { if (_hasArgumentErrors) { throw new QueryException(_args.Values.Select(t => t.Error)); } if (_vars == null) { return(_args); } var args = _args.ToDictionary(t => t.Key, t => t.Value); foreach (KeyValuePair <NameString, ArgumentVariableValue> var in _vars) { IError error = null; if (variables.TryGetVariable( var.Value.VariableName, out object value)) { value = var.Value.CoerceValue(value); } else { value = var.Value.DefaultValue; if (var.Value.Type.NamedType().IsLeafType() && value is IValueNode literal) { value = var.Value.Type.ParseLiteral(literal); } if (var.Value.Type.IsNonNullType() && (value is null || value is NullValueNode)) { error = ErrorBuilder.New() .SetMessage(string.Format( CultureInfo.InvariantCulture, TypeResources.ArgumentValueBuilder_NonNull, var.Key, TypeVisualizer.Visualize(var.Value.Type))) .AddLocation(Selection) .SetExtension(_argumentProperty, Path.New(var.Key)) .SetPath(_path) .Build(); } } if (error is null) { ValueKind kind = ValueKind.Unknown; if (value is IValueNode literal) { kind = literal.GetValueKind(); args[var.Key] = new ArgumentValue(var.Value.Argument, kind, literal); } else { Scalars.TryGetKind(value, out kind); args[var.Key] = new ArgumentValue(var.Value.Argument, kind, value); } } else { throw new QueryException(error); } } return(args); }