func querify(v interface{}) string {
	var buf bytes.Buffer
	querifyType(&buf, reflect.TypeOf(v))
	return buf.String()
}
querify uses querifyType, which recursively constructs
a minified query string from the provided struct v.

E.g., struct{Foo Int, Bar *Boolean} -> "{foo,bar}".
package githubql
import (
	"bytes"
	"io"
	"reflect"
	"sort"
	"unicode"
	"github.com/shurcooL/githubql/internal/hacky/caseconv"
)
func constructQuery(v interface{}, variables map[string]interface{}) string {
	query := querify(v)
	if variables != nil {
		return "query(" + queryArguments(variables) + ")" + query
	}
	return query
}
func constructMutation(v interface{}, variables map[string]interface{}) string {
	query := querify(v)
	if variables != nil {
		return "mutation(" + queryArguments(variables) + ")" + query
	}
	return "mutation" + query
}
func queryArguments(variables map[string]interface{}) string {
	sorted := make([]string, 0, len(variables))
	for k := range variables {
		sorted = append(sorted, k)
	}
	sort.Strings(sorted)
	var s string
	for _, k := range sorted {
		v := variables[k]
		s += "$" + k + ":"
		t := reflect.TypeOf(v)
		if t.Kind() == reflect.Ptr {
			s += t.Elem().Name()  
		} else {
			s += t.Name() + "!"  
		}
	}
	return s
}