// Given a variable definition, and any value of input, return a value which // adheres to the variable definition, or throw an error. func getVariableValue(schema Schema, definitionAST *ast.VariableDefinition, input interface{}) (interface{}, error) { ttype, err := typeFromAST(schema, definitionAST.Type) if err != nil { return nil, err } variable := definitionAST.Variable if ttype == nil || !IsInputType(ttype) { return "", gqlerrors.NewError( fmt.Sprintf(`Variable "$%v" expected value of type `+ `"%v" which cannot be used as an input type.`, variable.Name.Value, printer.Print(definitionAST.Type)), []ast.Node{definitionAST}, "", nil, []int{}, ) } if isValidInputValue(input, ttype) { if isNullish(input) { defaultValue := definitionAST.DefaultValue if defaultValue != nil { variables := map[string]interface{}{} val := valueFromAST(defaultValue, ttype, variables) return val, nil } } return coerceValue(ttype, input), nil } if isNullish(input) { return "", gqlerrors.NewError( fmt.Sprintf(`Variable "$%v" of required type `+ `"%v" was not provided.`, variable.Name.Value, printer.Print(definitionAST.Type)), []ast.Node{definitionAST}, "", nil, []int{}, ) } inputStr := "" b, err := json.Marshal(input) if err == nil { inputStr = string(b) } return "", gqlerrors.NewError( fmt.Sprintf(`Variable "$%v" expected value of type `+ `"%v" but got: %v.`, variable.Name.Value, printer.Print(definitionAST.Type), inputStr), []ast.Node{definitionAST}, "", nil, []int{}, ) }
func NewLocatedError(err interface{}, nodes []ast.Node) *gqlerrors.Error { message := "An unknown error occurred." if err, ok := err.(error); ok { message = err.Error() } if err, ok := err.(string); ok { message = err } stack := message return gqlerrors.NewError( message, nodes, stack, nil, []int{}, ) }