github.com/maeglindeveloper/gqlgen@v0.13.1-0.20210413081235-57808b12a0a0/graphql/handler/debug/tracer.go (about) 1 package debug 2 3 import ( 4 "context" 5 "encoding/json" 6 "fmt" 7 "io" 8 "os" 9 "strings" 10 11 . "github.com/logrusorgru/aurora" 12 "github.com/mattn/go-colorable" 13 "github.com/mattn/go-isatty" 14 15 "github.com/99designs/gqlgen/graphql" 16 ) 17 18 type Tracer struct { 19 DisableColor bool 20 au Aurora 21 out io.Writer 22 } 23 24 var _ interface { 25 graphql.HandlerExtension 26 graphql.ResponseInterceptor 27 } = &Tracer{} 28 29 func (a Tracer) ExtensionName() string { 30 return "ApolloTracing" 31 } 32 33 func (a *Tracer) Validate(schema graphql.ExecutableSchema) error { 34 isTTY := isatty.IsTerminal(os.Stdout.Fd()) 35 36 a.au = NewAurora(!a.DisableColor && isTTY) 37 a.out = colorable.NewColorableStdout() 38 39 return nil 40 } 41 42 func stringify(value interface{}) string { 43 valueJson, err := json.MarshalIndent(value, " ", " ") 44 if err == nil { 45 return string(valueJson) 46 } 47 48 return fmt.Sprint(value) 49 } 50 51 func (a Tracer) InterceptResponse(ctx context.Context, next graphql.ResponseHandler) *graphql.Response { 52 rctx := graphql.GetOperationContext(ctx) 53 54 fmt.Fprintln(a.out, "GraphQL Request {") 55 for _, line := range strings.Split(rctx.RawQuery, "\n") { 56 fmt.Fprintln(a.out, " ", Cyan(line)) 57 } 58 for name, value := range rctx.Variables { 59 fmt.Fprintf(a.out, " var %s = %s\n", name, Yellow(stringify(value))) 60 } 61 resp := next(ctx) 62 63 fmt.Fprintln(a.out, " resp:", Green(stringify(resp))) 64 for _, err := range resp.Errors { 65 fmt.Fprintln(a.out, " error:", Bold(err.Path.String()+":"), Red(err.Message)) 66 } 67 fmt.Fprintln(a.out, "}") 68 fmt.Fprintln(a.out) 69 return resp 70 71 }