From 58b7df5e9f1c0d4858528f326440599620a8c1fb Mon Sep 17 00:00:00 2001 From: Luke Shumaker Date: Sun, 14 Aug 2022 20:52:06 -0600 Subject: Create a compat/json compatibility library --- compat/json/adapter_test.go | 118 ---------------------------------- compat/json/borrowed_decode_test.go | 8 +-- compat/json/borrowed_encode_test.go | 2 +- compat/json/borrowed_fuzz_test.go | 2 +- compat/json/borrowed_scanner_test.go | 2 +- compat/json/borrowed_tagkey_test.go | 2 +- compat/json/borrowed_tags_test.go | 2 +- compat/json/compat.go | 121 +++++++++++++++++++++++++++++++++++ compat/json/compat_test.go | 37 +++++++++++ 9 files changed, 167 insertions(+), 127 deletions(-) delete mode 100644 compat/json/adapter_test.go create mode 100644 compat/json/compat.go create mode 100644 compat/json/compat_test.go (limited to 'compat/json') diff --git a/compat/json/adapter_test.go b/compat/json/adapter_test.go deleted file mode 100644 index 6c57ebc..0000000 --- a/compat/json/adapter_test.go +++ /dev/null @@ -1,118 +0,0 @@ -// Copyright (C) 2022 Luke Shumaker -// -// SPDX-License-Identifier: GPL-2.0-or-later - -package lowmemjson - -import ( - "bytes" - "encoding/json" - "io" -) - -func MarshalIndent(v any, prefix, indent string) ([]byte, error) { - var buf bytes.Buffer - formatter := &ReEncoder{ - Out: &buf, - Indent: indent, - prefix: prefix, - } - err := Encode(formatter, v) - return buf.Bytes(), err -} - -func Marshal(v any) ([]byte, error) { - var buf bytes.Buffer - formatter := &ReEncoder{ - Out: &buf, - Compact: true, - } - err := Encode(formatter, v) - return buf.Bytes(), err -} - -func HTMLEscape(dst *bytes.Buffer, src []byte) { - formatter := &ReEncoder{ - Out: dst, - } - _, _ = formatter.Write(src) -} - -func Compact(dst *bytes.Buffer, src []byte) error { - formatter := &ReEncoder{ - Out: dst, - Compact: true, - } - _, err := formatter.Write(src) - return err -} - -func Indent(dst *bytes.Buffer, src []byte, prefix, indent string) error { - formatter := &ReEncoder{ - Out: dst, - Indent: indent, - prefix: prefix, - } - _, err := formatter.Write(src) - return err -} - -func Valid(data []byte) bool { - formatter := &ReEncoder{ - Out: io.Discard, - Compact: true, - } - _, err := formatter.Write(data) - return err == nil -} - -func Unmarshal(data []byte, ptr any) error { - return Decode(bytes.NewReader(data), ptr) -} - -func init() { - forceBufio = true -} - -func (dec *Decoder) Buffered() io.Reader { - dat, _ := dec.buf.Peek(dec.buf.Buffered()) - return bytes.NewReader(dat) -} - -//func (dec *Decoder) Token() (Token, error) - -///////////////////////////////////////////////////////////////////// - -type ( - Number = json.Number - Marshaler = json.Marshaler - RawMessage = json.RawMessage - - UnsupportedValueError = json.UnsupportedValueError - MarshalerError = json.MarshalerError - UnmarshalTypeError = json.UnmarshalTypeError -) - -const ( - startDetectingCyclesAfter = 1000 -) - -func isSpace(c byte) bool { - switch c { - case 0x0020, 0x000A, 0x000D, 0x0009: - return true - default: - return false - } -} - -type encodeState struct { - bytes.Buffer -} - -func (es *encodeState) string(str string, _ bool) { - encodeString(&es.Buffer, str) -} -func (es *encodeState) stringBytes(str []byte, _ bool) { - encodeString(&es.Buffer, str) -} diff --git a/compat/json/borrowed_decode_test.go b/compat/json/borrowed_decode_test.go index ac8594b..306f85e 100644 --- a/compat/json/borrowed_decode_test.go +++ b/compat/json/borrowed_decode_test.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -package lowmemjson // MODIFIED +package json import ( "bytes" @@ -19,6 +19,8 @@ import ( "strings" "testing" "time" + + "git.lukeshu.com/go/lowmemjson" // MODIFIED ) type T struct { @@ -1093,9 +1095,7 @@ func equalError(a, b error) bool { func TestUnmarshal(t *testing.T) { t.Skip() // TODO for i, tt := range unmarshalTests { - scan := &ReEncoder{ - Out: io.Discard, - } + scan := lowmemjson.ReEncoder{Out: io.Discard} // MODIFIED in := []byte(tt.in) if _, err := scan.Write(in); err != nil { if !equalError(err, tt.err) { diff --git a/compat/json/borrowed_encode_test.go b/compat/json/borrowed_encode_test.go index 9659910..bb7c9dc 100644 --- a/compat/json/borrowed_encode_test.go +++ b/compat/json/borrowed_encode_test.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -package lowmemjson // MODIFIED +package json import ( "bytes" diff --git a/compat/json/borrowed_fuzz_test.go b/compat/json/borrowed_fuzz_test.go index 21756a7..82e6ada 100644 --- a/compat/json/borrowed_fuzz_test.go +++ b/compat/json/borrowed_fuzz_test.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -package lowmemjson // MODIFIED +package json import ( "testing" diff --git a/compat/json/borrowed_scanner_test.go b/compat/json/borrowed_scanner_test.go index c5d67e6..4955405 100644 --- a/compat/json/borrowed_scanner_test.go +++ b/compat/json/borrowed_scanner_test.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -package lowmemjson // MODIFIED +package json import ( "bytes" diff --git a/compat/json/borrowed_tagkey_test.go b/compat/json/borrowed_tagkey_test.go index 2d4d2c0..6a2d612 100644 --- a/compat/json/borrowed_tagkey_test.go +++ b/compat/json/borrowed_tagkey_test.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -package lowmemjson // MODIFIED +package json import ( "testing" diff --git a/compat/json/borrowed_tags_test.go b/compat/json/borrowed_tags_test.go index 28d76e9..8ba8ddd 100644 --- a/compat/json/borrowed_tags_test.go +++ b/compat/json/borrowed_tags_test.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -package lowmemjson // MODIFIED +package json import ( "testing" diff --git a/compat/json/compat.go b/compat/json/compat.go new file mode 100644 index 0000000..78a9d5f --- /dev/null +++ b/compat/json/compat.go @@ -0,0 +1,121 @@ +// Copyright (C) 2022 Luke Shumaker +// +// SPDX-License-Identifier: GPL-2.0-or-later + +package json + +import ( + "bufio" + "bytes" + "encoding/json" + "io" + + "git.lukeshu.com/go/lowmemjson" +) + +type ( + Number = json.Number + Marshaler = json.Marshaler + RawMessage = json.RawMessage + + // low-level decode errors + SyntaxError = lowmemjson.SyntaxError + UnmarshalFieldError = json.UnmarshalFieldError + UnmarshalTypeError = json.UnmarshalTypeError // lowmemjson.DecodeTypeError + + // high-level decode errors + InvalidUnmarshalError = json.InvalidUnmarshalError // lowmemjson.DecodeArgumentError + + // marshal errors + InvalidUTF8Error = json.InvalidUTF8Error + MarshalerError = json.MarshalerError + UnsupportedTypeError = json.UnsupportedTypeError + UnsupportedValueError = json.UnsupportedValueError +) + +///////////////////////////////////////////////////////////////////// + +func MarshalIndent(v any, prefix, indent string) ([]byte, error) { + var buf bytes.Buffer + formatter := &lowmemjson.ReEncoder{ + Out: &buf, + Indent: indent, + Prefix: prefix, + } + err := lowmemjson.Encode(formatter, v) + return buf.Bytes(), err +} + +func Marshal(v any) ([]byte, error) { + var buf bytes.Buffer + formatter := &lowmemjson.ReEncoder{ + Out: &buf, + Compact: true, + } + err := lowmemjson.Encode(formatter, v) + return buf.Bytes(), err +} + +func HTMLEscape(dst *bytes.Buffer, src []byte) { + formatter := &lowmemjson.ReEncoder{ + Out: dst, + } + _, _ = formatter.Write(src) +} + +func Compact(dst *bytes.Buffer, src []byte) error { + formatter := &lowmemjson.ReEncoder{ + Out: dst, + Compact: true, + } + _, err := formatter.Write(src) + return err +} + +func Indent(dst *bytes.Buffer, src []byte, prefix, indent string) error { + formatter := &lowmemjson.ReEncoder{ + Out: dst, + Indent: indent, + Prefix: prefix, + } + _, err := formatter.Write(src) + return err +} + +func Valid(data []byte) bool { + formatter := &lowmemjson.ReEncoder{ + Out: io.Discard, + Compact: true, + } + _, err := formatter.Write(data) + return err == nil +} + +func Unmarshal(data []byte, ptr any) error { + return lowmemjson.Decode(bytes.NewReader(data), ptr) +} + +///////////////////////////////////////////////////////////////////// + +type Decoder struct { + *lowmemjson.Decoder + buf *bufio.Reader +} + +func NewDecoder(r io.Reader) *Decoder { + br, ok := r.(*bufio.Reader) + if !ok { + br = bufio.NewReader(r) + } + return &Decoder{ + Decoder: lowmemjson.NewDecoder(br), + buf: br, + } +} + +func (dec *Decoder) Buffered() io.Reader { + dat, _ := dec.buf.Peek(dec.buf.Buffered()) + return bytes.NewReader(dat) +} + +//func (dec *Decoder) Token() (Token, error) diff --git a/compat/json/compat_test.go b/compat/json/compat_test.go new file mode 100644 index 0000000..399ff02 --- /dev/null +++ b/compat/json/compat_test.go @@ -0,0 +1,37 @@ +// Copyright (C) 2022 Luke Shumaker +// +// SPDX-License-Identifier: GPL-2.0-or-later + +package json + +import ( + "bytes" + + "git.lukeshu.com/go/lowmemjson/internal" +) + +var parseTag = internal.ParseTag + +const ( + startDetectingCyclesAfter = 1000 +) + +func isSpace(c byte) bool { + switch c { + case 0x0020, 0x000A, 0x000D, 0x0009: + return true + default: + return false + } +} + +type encodeState struct { + bytes.Buffer +} + +func (es *encodeState) string(str string, _ bool) { + internal.EncodeStringFromString(&es.Buffer, str) +} +func (es *encodeState) stringBytes(str []byte, _ bool) { + internal.EncodeStringFromBytes(&es.Buffer, str) +} -- cgit v1.2.3-54-g00ecf