Skip to content

Commit

Permalink
Simply code
Browse files Browse the repository at this point in the history
Reduces the number of branches in code, though the server error is printed first before any error JSON returned. This does have the benefit, however, of a more obvious error printed first, followed by details returned by the server.
  • Loading branch information
heaths committed May 19, 2022
1 parent b7058d7 commit 42954d4
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 30 deletions.
50 changes: 21 additions & 29 deletions pkg/cmd/api/api.go
Expand Up @@ -300,12 +300,8 @@ func apiRun(opts *ApiOptions) error {
template := export.NewTemplate(opts.IO, opts.Template)

var pages interface{}
var outBuffer *bytes.Buffer
out := opts.IO.Out
if opts.Paginate {
outBuffer = &bytes.Buffer{}
out = outBuffer
}
var serverError string
buffer := &bytes.Buffer{}

isJSON := false
hasNextPage := true
Expand All @@ -316,8 +312,9 @@ func apiRun(opts *ApiOptions) error {
}

var endCursor string
isJSON, endCursor, err = processResponse(resp, opts, headersOutputStream, out, &template)
isJSON, endCursor, serverError, err = processResponse(resp, opts, headersOutputStream, buffer)
if err != nil {
printResponse(buffer, opts, isJSON, serverError != "", opts.IO.Out, &template)
return err
}

Expand All @@ -326,11 +323,11 @@ func apiRun(opts *ApiOptions) error {
}

if isJSON {
err = mergeJSON(&pages, outBuffer)
err = mergeJSON(&pages, buffer)
if err != nil {
return err
}
outBuffer.Reset()
buffer.Reset()
}

if isGraphQL {
Expand All @@ -355,17 +352,18 @@ func apiRun(opts *ApiOptions) error {
return err
}

outBuffer := bytes.NewBuffer(buf)
err = printResponse(outBuffer, opts, isJSON, false, opts.IO.Out, &template)
if err != nil {
return err
}
buffer = bytes.NewBuffer(buf)
}

err = printResponse(buffer, opts, isJSON, false, opts.IO.Out, &template)
if err != nil {
return err
}

return template.End()
}

func processResponse(resp *http.Response, opts *ApiOptions, headersOutputStream io.Writer, out io.Writer, template *export.Template) (isJSON bool, endCursor string, err error) {
func processResponse(resp *http.Response, opts *ApiOptions, headersOutputStream io.Writer, w io.Writer) (isJSON bool, endCursor string, serverError string, err error) {
if opts.ShowResponseHeaders {
fmt.Fprintln(headersOutputStream, resp.Proto, resp.Status)
printHeaders(headersOutputStream, resp.Header, opts.IO.ColorEnabled())
Expand All @@ -380,7 +378,6 @@ func processResponse(resp *http.Response, opts *ApiOptions, headersOutputStream

isJSON, _ = regexp.MatchString(`[/+]json(;|$)`, resp.Header.Get("Content-Type"))

var serverError string
if isJSON && (opts.RequestPath == "graphql" || resp.StatusCode >= 400) {
responseBody, serverError, err = parseErrorResponse(responseBody, resp.StatusCode)
if err != nil {
Expand All @@ -395,14 +392,9 @@ func processResponse(resp *http.Response, opts *ApiOptions, headersOutputStream
responseBody = io.TeeReader(responseBody, bodyCopy)
}

if !opts.Paginate {
// Print the body immediately if not paginating
err = printResponse(responseBody, opts, isJSON, serverError != "", out, template)
} else {
_, err = io.Copy(out, responseBody)
if err != nil {
return
}
_, err = io.Copy(w, responseBody)
if err != nil {
return
}

if serverError == "" && resp.StatusCode > 299 {
Expand All @@ -427,23 +419,23 @@ func processResponse(resp *http.Response, opts *ApiOptions, headersOutputStream
return
}

func printResponse(responseBody io.Reader, opts *ApiOptions, isJSON, hasServerErr bool, out io.Writer, template *export.Template) (err error) {
func printResponse(body io.Reader, opts *ApiOptions, isJSON, hasServerErr bool, w io.Writer, template *export.Template) (err error) {
if opts.FilterOutput != "" && !hasServerErr {
// TODO: reuse parsed query across pagination invocations
err = export.FilterJSON(out, responseBody, opts.FilterOutput)
err = export.FilterJSON(w, body, opts.FilterOutput)
if err != nil {
return
}
} else if opts.Template != "" && !hasServerErr {
// TODO: reuse parsed template across pagination invocations
err = template.Execute(responseBody)
err = template.Execute(body)
if err != nil {
return
}
} else if isJSON && opts.IO.ColorEnabled() {
err = jsoncolor.Write(out, responseBody, " ")
err = jsoncolor.Write(w, body, " ")
} else {
_, err = io.Copy(out, responseBody)
_, err = io.Copy(w, body)
}
return
}
Expand Down
5 changes: 4 additions & 1 deletion pkg/cmd/api/api_test.go
Expand Up @@ -1304,7 +1304,10 @@ func Test_processResponse_template(t *testing.T) {
Template: `{{range .}}{{.title}} ({{.labels | pluck "name" | join ", " }}){{"\n"}}{{end}}`,
}
template := export.NewTemplate(ios, opts.Template)
_, _, err := processResponse(&resp, &opts, io.Discard, stdout, &template)
isJSON, _, _, err := processResponse(&resp, &opts, io.Discard, stdout)
require.NoError(t, err)

err = printResponse(stdout, &opts, isJSON, false, stdout, &template)
require.NoError(t, err)

err = template.End()
Expand Down

0 comments on commit 42954d4

Please sign in to comment.