diff options
Diffstat (limited to 'compat/json/compat.go')
-rw-r--r-- | compat/json/compat.go | 24 |
1 files changed, 17 insertions, 7 deletions
diff --git a/compat/json/compat.go b/compat/json/compat.go index 688b35c..3678135 100644 --- a/compat/json/compat.go +++ b/compat/json/compat.go @@ -72,25 +72,35 @@ func Marshal(v any) ([]byte, error) { } type Encoder struct { + out io.Writer + buf bytes.Buffer encoder *lowmemjson.Encoder formatter *lowmemjson.ReEncoder } func NewEncoder(w io.Writer) *Encoder { ret := &Encoder{ - formatter: lowmemjson.NewReEncoder(w, lowmemjson.ReEncoderConfig{ - AllowMultipleValues: true, - - Compact: true, - ForceTrailingNewlines: true, - }), + out: w, } + ret.formatter = lowmemjson.NewReEncoder(&ret.buf, lowmemjson.ReEncoderConfig{ + AllowMultipleValues: true, + + Compact: true, + ForceTrailingNewlines: true, + }) ret.encoder = lowmemjson.NewEncoder(ret.formatter) return ret } func (enc *Encoder) Encode(v any) error { - return convertEncodeError(enc.encoder.Encode(v)) + if err := convertEncodeError(enc.encoder.Encode(v)); err != nil { + enc.buf.Reset() + return err + } + if _, err := enc.buf.WriteTo(enc.out); err != nil { + return err + } + return nil } func (enc *Encoder) SetEscapeHTML(on bool) { |