graphql-go / graphql

An implementation of GraphQL for Go / Golang
MIT License
9.87k stars 839 forks source link

Further flush out ability to auto-bind to functions and types. #558

Closed alancnet closed 4 years ago

alancnet commented 4 years ago

Hello, graphql-go authors.

I began this PR because I encountered a bug in BindFields where the name given to a type would be the JSON field name, which resulted in conflicts. I was using that function to automatically bind functions, and create types, so that the resolver functions themselves could be reused as regular exported functions.

I migrated that code into this project as well, as I feel it offers a significant improvement to dev experience.

type GreetingInput struct {
    Name string `json:"name"`
}

func Greeting(input GreetingInput) string {
    return fmt.Sprintf("Hello %s", input.Name)
}
...
rootQuery := graphql.ObjectConfig{Name: "RootQuery", Fields: graphql.Fields{
    "greeting": graphql.Bind(Greeting),
}}

or almost any manner of function along these lines:

func MyFunction(ctx context.Context, input MyFunctionInput) (output MyFunctionOutput, error) ...
func MyFunction(ctx *context.Context, input *MyFunctionInput) (output *MyFunctionOutput, error) ...
func MyFunction(ctx context.Context) (output MyFunctionOutput, error) ...
func MyFunction(input MyFunctionInput) (output MyFunctionOutput, error) ...
func MyFunction(input MyFunctionInput) (output MyFunctionOutput) ...
func MyFunction() (output MyFunctionOutput) ...
func MyFunction() (output string) ...

or constant

rootQuery := graphql.ObjectConfig{Name: "RootQuery", Fields: graphql.Fields{
    "version": graphql.Bind(1.1),
}}

Cheers!

-Alan 🤖

coveralls commented 4 years ago

Coverage Status

Coverage decreased (-0.03%) to 92.344% when pulling 336c4d6d70d26396f91beb7428c1ddec2c5c9868 on teamjobot:master into 9441c498a148d34c007886e14295e13eb3efc340 on graphql-go:master.