From 0933b735aef10b2d6c2f70daa682d0a00f66d118 Mon Sep 17 00:00:00 2001 From: Charlie Tonneslan Date: Mon, 25 May 2026 10:16:30 -0400 Subject: [PATCH] json: return writer errors from Encoder.Encode The inner `if _, err := enc.writer.Write(b)` shadowed the outer err with :=, so the writer error got stored on enc.err but the function still returned the (nil) outer err. First Encode after a write failure would look like it succeeded; only the next call would surface the error via the enc.err early-return at the top. Switch the assignment to = so the outer err is set, then returned. Closes #139 Signed-off-by: Charlie Tonneslan --- json/json.go | 2 +- json/json_test.go | 13 +++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/json/json.go b/json/json.go index 028fd1f3..ae4c451c 100644 --- a/json/json.go +++ b/json/json.go @@ -533,7 +533,7 @@ func (enc *Encoder) Encode(v any) error { b = enc.buffer.Bytes() } - if _, err := enc.writer.Write(b); err != nil { + if _, err = enc.writer.Write(b); err != nil { enc.err = err } diff --git a/json/json_test.go b/json/json_test.go index 8256be2a..e1ba9fea 100644 --- a/json/json_test.go +++ b/json/json_test.go @@ -1839,6 +1839,19 @@ func TestSetAppendNewline(t *testing.T) { } } +type errWriter struct{ err error } + +func (w *errWriter) Write(p []byte) (int, error) { return 0, w.err } + +func TestEncoderEncodeReturnsWriterError(t *testing.T) { + want := errors.New("boom") + enc := NewEncoder(&errWriter{err: want}) + + if err := enc.Encode("v"); !errors.Is(err, want) { + t.Errorf("expected writer error to surface, got %v", err) + } +} + func TestEscapeString(t *testing.T) { b := Escape(`value`) x := []byte(`"value"`)