summaryrefslogtreecommitdiff
path: root/compat/json
diff options
context:
space:
mode:
authorLuke Shumaker <lukeshu@lukeshu.com>2023-02-16 22:30:54 -0700
committerLuke Shumaker <lukeshu@lukeshu.com>2023-02-16 22:30:54 -0700
commitdebef01cc500fb9368e1d6d0206a32ca358a8c98 (patch)
treef021ae7890922e10a1aa119dcdbd7dd2a587f09e /compat/json
parentd7414035894f378c9e1d48b04a767f61b082186a (diff)
parentf823342d5b9c2ca376d038471889176ab74acf1b (diff)
Merge branch 'lukeshu/misc'
Diffstat (limited to 'compat/json')
-rw-r--r--compat/json/compat.go43
-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)
}
}