aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin Polden <mpolden@mpolden.no>2024-03-15 09:35:47 +0100
committerMartin Polden <mpolden@mpolden.no>2024-03-15 09:35:47 +0100
commit87740ab0322a9e534a30440d2f4bda05d3f570d1 (patch)
tree4402c206b855352a5b61602584a6ad8d2f432749
parent9be7a2f59e1416889ef44e98a57571aabfac95c9 (diff)
Pretty-print JSON for unknown event types
-rw-r--r--client/go/internal/cli/cmd/query.go3
-rw-r--r--client/go/internal/cli/cmd/query_test.go7
-rw-r--r--client/go/internal/ioutil/ioutil.go3
-rw-r--r--client/go/internal/sse/sse.go25
-rw-r--r--client/go/internal/sse/sse_test.go13
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()