summaryrefslogtreecommitdiff
path: root/compat/json/compat.go
diff options
context:
space:
mode:
authorLuke Shumaker <lukeshu@lukeshu.com>2023-02-07 14:01:44 -0700
committerLuke Shumaker <lukeshu@lukeshu.com>2023-02-10 14:09:56 -0700
commit483bbdc970b26d774ace39edfde8420aba53b742 (patch)
treeee5fcacbba4d4eb7c44e4cb1f35fb950f11aee1d /compat/json/compat.go
parent480ccfd05a13ac36516c536a71203280a31b4d28 (diff)
Sync borrowed code from Go 1.20
New tests mean encode.go and compat.go also need some bugfixes.
Diffstat (limited to 'compat/json/compat.go')
-rw-r--r--compat/json/compat.go24
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) {