diff options
author | Martin Polden <mpolden@mpolden.no> | 2024-03-15 09:35:47 +0100 |
---|---|---|
committer | Martin Polden <mpolden@mpolden.no> | 2024-03-15 09:35:47 +0100 |
commit | 87740ab0322a9e534a30440d2f4bda05d3f570d1 (patch) | |
tree | 4402c206b855352a5b61602584a6ad8d2f432749 /client/go | |
parent | 9be7a2f59e1416889ef44e98a57571aabfac95c9 (diff) |
Pretty-print JSON for unknown event types
Diffstat (limited to 'client/go')
-rw-r--r-- | client/go/internal/cli/cmd/query.go | 3 | ||||
-rw-r--r-- | client/go/internal/cli/cmd/query_test.go | 7 | ||||
-rw-r--r-- | client/go/internal/ioutil/ioutil.go | 3 | ||||
-rw-r--r-- | client/go/internal/sse/sse.go | 25 | ||||
-rw-r--r-- | client/go/internal/sse/sse_test.go | 13 |
5 files changed, 48 insertions, 3 deletions
diff --git a/client/go/internal/cli/cmd/query.go b/client/go/internal/cli/cmd/query.go index c55c28fb0f6..bddf3af06f9 100644 --- a/client/go/internal/cli/cmd/query.go +++ b/client/go/internal/cli/cmd/query.go @@ -170,7 +170,8 @@ func printResponseBody(body io.Reader, options printOptions, cli *CLI) error { if writingLine { fmt.Fprintln(cli.Stdout) } - return errHint(fmt.Errorf("unknown event type: %q", event.Name), "Event parsing can be disabled with --format=plain") + event.Data = ioutil.StringToJSON(event.Data) // Optimistically pretty-print JSON + fmt.Fprint(cli.Stdout, event.String()) } else { fmt.Fprintln(cli.Stdout) break diff --git a/client/go/internal/cli/cmd/query_test.go b/client/go/internal/cli/cmd/query_test.go index 470a5c5d1e2..3a2eeba159a 100644 --- a/client/go/internal/cli/cmd/query_test.go +++ b/client/go/internal/cli/cmd/query_test.go @@ -106,7 +106,12 @@ data: Manhattan event: error data: {"message": "something went wrong"} ` - assertStreamingQueryErr(t, "The Manhattan\n", "Error: unknown event type: \"error\"\nHint: Event parsing can be disabled with --format=plain\n", bodyWithError) + assertStreamingQuery(t, `The Manhattan +event: error +data: { + "message": "something went wrong" +} +`, bodyWithError) assertStreamingQuery(t, bodyWithError, bodyWithError, "--format=plain") } diff --git a/client/go/internal/ioutil/ioutil.go b/client/go/internal/ioutil/ioutil.go index d3a33698d13..0abb9915c39 100644 --- a/client/go/internal/ioutil/ioutil.go +++ b/client/go/internal/ioutil/ioutil.go @@ -66,6 +66,9 @@ func ReaderToJSON(reader io.Reader) string { return prettyJSON.String() } +// StringToJSON returns string s as indented JSON. +func StringToJSON(s string) string { return ReaderToJSON(strings.NewReader(s)) } + // AtomicWriteFile atomically writes data to filename. func AtomicWriteFile(filename string, data []byte) error { dir := filepath.Dir(filename) diff --git a/client/go/internal/sse/sse.go b/client/go/internal/sse/sse.go index a056e4a598a..9a120944eec 100644 --- a/client/go/internal/sse/sse.go +++ b/client/go/internal/sse/sse.go @@ -83,7 +83,30 @@ func (d *Decoder) Decode() (*Event, error) { } // NewDecoder creates a new Decoder that reads from r. -func NewDecoder(r io.Reader) *Decoder { return &Decoder{scanner: bufio.NewScanner(r)} } +func NewDecoder(r io.Reader) *Decoder { + return &Decoder{scanner: bufio.NewScanner(r)} +} // IsEnd returns whether this event indicates that the stream has ended. func (e Event) IsEnd() bool { return e.Name == "end" } + +// String returns the string representation of event e. +func (e Event) String() string { + var sb strings.Builder + if e.Name != "" { + sb.WriteString("event: ") + sb.WriteString(e.Name) + sb.WriteString("\n") + } + if e.ID != "" { + sb.WriteString("id: ") + sb.WriteString(e.ID) + sb.WriteString("\n") + } + if e.Data != "" { + sb.WriteString("data: ") + sb.WriteString(e.Data) + sb.WriteString("\n") + } + return sb.String() +} diff --git a/client/go/internal/sse/sse_test.go b/client/go/internal/sse/sse_test.go index c81dc4995b6..0e0d6929c75 100644 --- a/client/go/internal/sse/sse_test.go +++ b/client/go/internal/sse/sse_test.go @@ -60,6 +60,19 @@ bad: field assertDecodeErrString(`invalid field name "bad": last read "bad: field"`, dec, t) } +func TestString(t *testing.T) { + assertString(t, "event: foo\ndata: bar\n", Event{Name: "foo", Data: "bar"}) + assertString(t, "event: foo\nid: 42\ndata: bar\n", Event{Name: "foo", ID: "42", Data: "bar"}) +} + +func assertString(t *testing.T, want string, event Event) { + t.Helper() + got := event.String() + if got != want { + t.Errorf("got %q, want %q", got, want) + } +} + func assertDecode(want *Event, dec *Decoder, t *testing.T) { t.Helper() got, err := dec.Decode() |