diff options
Diffstat (limited to 'compat/json')
-rw-r--r-- | compat/json/compat.go | 43 | ||||
-rw-r--r-- | compat/json/testcompat_test.go (renamed from compat/json/compat_test.go) | 12 |
2 files changed, 30 insertions, 25 deletions
diff --git a/compat/json/compat.go b/compat/json/compat.go index 3678135..c96470d 100644 --- a/compat/json/compat.go +++ b/compat/json/compat.go @@ -72,8 +72,11 @@ func Marshal(v any) ([]byte, error) { } type Encoder struct { - out io.Writer - buf bytes.Buffer + out io.Writer + buf bytes.Buffer + + cfg lowmemjson.ReEncoderConfig + encoder *lowmemjson.Encoder formatter *lowmemjson.ReEncoder } @@ -81,17 +84,23 @@ type Encoder struct { func NewEncoder(w io.Writer) *Encoder { ret := &Encoder{ out: w, - } - ret.formatter = lowmemjson.NewReEncoder(&ret.buf, lowmemjson.ReEncoderConfig{ - AllowMultipleValues: true, - Compact: true, - ForceTrailingNewlines: true, - }) - ret.encoder = lowmemjson.NewEncoder(ret.formatter) + cfg: lowmemjson.ReEncoderConfig{ + AllowMultipleValues: true, + + Compact: true, + ForceTrailingNewlines: true, + }, + } + ret.refreshConfig() return ret } +func (enc *Encoder) refreshConfig() { + enc.formatter = lowmemjson.NewReEncoder(&enc.buf, enc.cfg) + enc.encoder = lowmemjson.NewEncoder(enc.formatter) +} + func (enc *Encoder) Encode(v any) error { if err := convertEncodeError(enc.encoder.Encode(v)); err != nil { enc.buf.Reset() @@ -104,17 +113,19 @@ func (enc *Encoder) Encode(v any) error { } func (enc *Encoder) SetEscapeHTML(on bool) { - var escaper lowmemjson.BackslashEscaper - if !on { - escaper = lowmemjson.EscapeDefaultNonHTMLSafe + if on { + enc.cfg.BackslashEscape = lowmemjson.EscapeDefault + } else { + enc.cfg.BackslashEscape = lowmemjson.EscapeDefaultNonHTMLSafe } - enc.formatter.BackslashEscape = escaper + enc.refreshConfig() } func (enc *Encoder) SetIndent(prefix, indent string) { - enc.formatter.Compact = prefix == "" && indent == "" - enc.formatter.Prefix = prefix - enc.formatter.Indent = indent + enc.cfg.Compact = prefix == "" && indent == "" + enc.cfg.Prefix = prefix + enc.cfg.Indent = indent + enc.refreshConfig() } // ReEncode wrappers ///////////////////////////////////////////////// diff --git a/compat/json/compat_test.go b/compat/json/testcompat_test.go index 07c75bc..42cbf5c 100644 --- a/compat/json/compat_test.go +++ b/compat/json/testcompat_test.go @@ -11,8 +11,8 @@ import ( _ "unsafe" "git.lukeshu.com/go/lowmemjson" - "git.lukeshu.com/go/lowmemjson/internal/fastio" "git.lukeshu.com/go/lowmemjson/internal/jsonparse" + "git.lukeshu.com/go/lowmemjson/internal/jsonstring" "git.lukeshu.com/go/lowmemjson/internal/jsonstruct" ) @@ -58,20 +58,14 @@ type encodeState struct { bytes.Buffer } -//go:linkname encodeStringFromString git.lukeshu.com/go/lowmemjson.encodeStringFromString -func encodeStringFromString(w fastio.AllWriter, escaper lowmemjson.BackslashEscaper, str string) error - -//go:linkname encodeStringFromBytes git.lukeshu.com/go/lowmemjson.encodeStringFromBytes -func encodeStringFromBytes(w fastio.AllWriter, escaper lowmemjson.BackslashEscaper, str []byte) error - func (es *encodeState) string(str string, _ bool) { - if err := encodeStringFromString(&es.Buffer, nil, str); err != nil { + if err := jsonstring.EncodeStringFromString(&es.Buffer, lowmemjson.EscapeDefault, str); err != nil { panic(err) } } func (es *encodeState) stringBytes(str []byte, _ bool) { - if err := encodeStringFromBytes(&es.Buffer, nil, str); err != nil { + if err := jsonstring.EncodeStringFromBytes(&es.Buffer, lowmemjson.EscapeDefault, str); err != nil { panic(err) } } |