func NewClient(endpoint string, httpClient Doer) Client {
	if httpClient == nil || httpClient == (*http.Client)(nil) {
		httpClient = http.DefaultClient
	}
	return &client{httpClient, endpoint, http.MethodPost}
}
NewClient returns a Client which makes requests to the given endpoint,
suitable for most users.

The client makes POST requests to the given GraphQL endpoint using standard
GraphQL HTTP-over-JSON transport.  It will use the given http client, or
http.DefaultClient if a nil client is passed.

The typical method of adding authentication headers is to wrap the client's
Transport to add those headers.  See example/caller.go for an example.
package graphql
import (
	"bytes"
	"context"
	"encoding/json"
	"fmt"
	"io/ioutil"
	"net/http"
	"github.com/vektah/gqlparser/v2/gqlerror"
)
type Client interface {
	MakeRequest(
		ctx context.Context,
		opName string,
		query string,
		input, retval interface{},
	) error
}
type client struct {
	httpClient Doer
	endpoint   string
	method     string
}