Skip to content

Commit 8e50013

Browse files
committed
use MarshalJSONTo function
Signed-off-by: Tim Ramlot <[email protected]>
1 parent 200d5ad commit 8e50013

File tree

4 files changed

+43
-72
lines changed

4 files changed

+43
-72
lines changed

fieldpath/serialize-pe.go

Lines changed: 11 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -55,11 +55,6 @@ var (
5555
peKeySepBytes = []byte{peKey, peSeparator}
5656
)
5757

58-
// writeValueToEncoder writes a value to an Encoder.
59-
func writeValueToEncoder(v value.Value, enc *jsontext.Encoder) error {
60-
return json.MarshalEncode(enc, v.Unstructured(), json.Deterministic(true))
61-
}
62-
6358
// FieldListFromJSON is a helper function for reading a JSON document.
6459
func fieldListFromJSON(input []byte) (value.FieldList, error) {
6560
parser := jsontext.NewDecoder(bytes.NewBuffer(input))
@@ -145,58 +140,38 @@ func DeserializePathElement(s string) (PathElement, error) {
145140
}
146141
}
147142

148-
type PathElementSerializer struct {
149-
buffer bytes.Buffer
150-
encoder jsontext.Encoder
151-
}
152-
153143
// SerializePathElement serializes a path element
154144
func SerializePathElement(pe PathElement) (string, error) {
155-
byteVal, err := (&PathElementSerializer{}).serialize(pe)
156-
return string(byteVal), err
157-
}
158-
159-
func (pes *PathElementSerializer) serialize(pe PathElement) (string, error) {
160-
pes.buffer.Reset()
145+
builder := strings.Builder{}
161146

162147
switch {
163148
case pe.FieldName != nil:
164-
if _, err := pes.buffer.Write(peFieldSepBytes); err != nil {
149+
if _, err := builder.Write(peFieldSepBytes); err != nil {
165150
return "", err
166151
}
167-
pes.buffer.WriteString(*pe.FieldName)
152+
builder.WriteString(*pe.FieldName)
168153
case pe.Key != nil:
169-
if _, err := pes.buffer.Write(peKeySepBytes); err != nil {
154+
if _, err := builder.Write(peKeySepBytes); err != nil {
170155
return "", err
171156
}
172-
pes.encoder.Reset(&pes.buffer)
173-
pes.encoder.WriteToken(jsontext.BeginObject)
174-
for _, f := range *pe.Key {
175-
if err := pes.encoder.WriteToken(jsontext.String(f.Name)); err != nil {
176-
return "", err
177-
}
178-
if err := writeValueToEncoder(f.Value, &pes.encoder); err != nil {
179-
return "", err
180-
}
157+
if err := json.MarshalWrite(&builder, *pe.Key, json.Deterministic(true)); err != nil {
158+
return "", err
181159
}
182-
pes.encoder.WriteToken(jsontext.EndObject)
183160
case pe.Value != nil:
184-
if _, err := pes.buffer.Write(peValueSepBytes); err != nil {
161+
if _, err := builder.Write(peValueSepBytes); err != nil {
185162
return "", err
186163
}
187-
pes.encoder.Reset(&pes.buffer)
188-
if err := writeValueToEncoder(*pe.Value, &pes.encoder); err != nil {
164+
if err := json.MarshalWrite(&builder, (*pe.Value).Unstructured(), json.Deterministic(true)); err != nil {
189165
return "", err
190166
}
191167
case pe.Index != nil:
192-
if _, err := pes.buffer.Write(peIndexSepBytes); err != nil {
168+
if _, err := builder.Write(peIndexSepBytes); err != nil {
193169
return "", err
194170
}
195-
pes.buffer.WriteString(strconv.Itoa(*pe.Index))
171+
builder.WriteString(strconv.Itoa(*pe.Index))
196172
default:
197173
return "", errors.New("invalid PathElement")
198174
}
199175

200-
// TODO: is there a way to not emit newlines
201-
return strings.TrimSpace(pes.buffer.String()), nil
176+
return builder.String(), nil
202177
}

fieldpath/serialize.go

Lines changed: 13 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -17,50 +17,24 @@ limitations under the License.
1717
package fieldpath
1818

1919
import (
20-
"bytes"
2120
"fmt"
2221
"io"
2322
"sort"
24-
"sync"
25-
"unicode"
2623

24+
"github.com/go-json-experiment/json"
2725
"github.com/go-json-experiment/json/jsontext"
2826
)
2927

3028
func (s *Set) ToJSON() ([]byte, error) {
31-
buf := bytes.Buffer{}
32-
enc := jsontext.Encoder{}
33-
enc.Reset(&buf)
34-
if err := s.emitContentsV1(false, &enc); err != nil {
35-
return nil, err
36-
}
37-
return bytes.TrimSpace(buf.Bytes()), nil
29+
return json.Marshal((*setContentsV1)(s))
3830
}
3931

4032
func (s *Set) ToJSONStream(w io.Writer) error {
41-
buf := bytes.Buffer{}
42-
enc := jsontext.Encoder{}
43-
enc.Reset(&buf)
44-
if err := s.emitContentsV1(false, &enc); err != nil {
45-
return err
46-
}
47-
bufLen := len(bytes.TrimRightFunc(buf.Bytes(), unicode.IsSpace))
48-
buf.Truncate(bufLen)
49-
_, err := buf.WriteTo(w)
50-
return err
51-
}
52-
53-
var pool = sync.Pool{
54-
New: func() any {
55-
return &PathElementSerializer{}
56-
},
33+
return json.MarshalWrite(w, (*setContentsV1)(s))
5734
}
5835

5936
func writePathKey(enc *jsontext.Encoder, pe PathElement) error {
60-
pes := pool.Get().(*PathElementSerializer)
61-
defer pool.Put(pes)
62-
63-
key, err := pes.serialize(pe)
37+
key, err := SerializePathElement(pe)
6438
if err != nil {
6539
return err
6640
}
@@ -71,7 +45,13 @@ func writePathKey(enc *jsontext.Encoder, pe PathElement) error {
7145
return nil
7246
}
7347

74-
func (s *Set) emitContentsV1(includeSelf bool, om *jsontext.Encoder) error {
48+
type setContentsV1 Set
49+
50+
func (s *setContentsV1) MarshalJSONTo(enc *jsontext.Encoder) error {
51+
return s.emitContentsV1(false, enc)
52+
}
53+
54+
func (s *setContentsV1) emitContentsV1(includeSelf bool, om *jsontext.Encoder) error {
7555
if err := om.WriteToken(jsontext.BeginObject); err != nil {
7656
return err
7757
}
@@ -103,7 +83,7 @@ func (s *Set) emitContentsV1(includeSelf bool, om *jsontext.Encoder) error {
10383
if err := writePathKey(om, cpe); err != nil {
10484
return err
10585
}
106-
if err := s.Children.members[ci].set.emitContentsV1(c == 0, om); err != nil {
86+
if err := (*setContentsV1)(s.Children.members[ci].set).emitContentsV1(c == 0, om); err != nil {
10787
return err
10888
}
10989

@@ -134,7 +114,7 @@ func (s *Set) emitContentsV1(includeSelf bool, om *jsontext.Encoder) error {
134114
if err := writePathKey(om, cpe); err != nil {
135115
return err
136116
}
137-
if err := s.Children.members[ci].set.emitContentsV1(false, om); err != nil {
117+
if err := (*setContentsV1)(s.Children.members[ci].set).emitContentsV1(false, om); err != nil {
138118
return err
139119
}
140120

value/fields.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@ package value
1919
import (
2020
"sort"
2121
"strings"
22+
23+
"github.com/go-json-experiment/json"
24+
"github.com/go-json-experiment/json/jsontext"
2225
)
2326

2427
// Field is an individual key-value pair.
@@ -31,6 +34,21 @@ type Field struct {
3134
// have a different name.
3235
type FieldList []Field
3336

37+
func (fl FieldList) MarshalJSONTo(enc *jsontext.Encoder) error {
38+
enc.WriteToken(jsontext.BeginObject)
39+
for _, f := range fl {
40+
if err := enc.WriteToken(jsontext.String(f.Name)); err != nil {
41+
return err
42+
}
43+
if err := json.MarshalEncode(enc, f.Value.Unstructured(), json.Deterministic(true)); err != nil {
44+
return err
45+
}
46+
}
47+
enc.WriteToken(jsontext.EndObject)
48+
49+
return nil
50+
}
51+
3452
// Copy returns a copy of the FieldList.
3553
// Values are not copied.
3654
func (f FieldList) Copy() FieldList {

value/value.go

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ limitations under the License.
1717
package value
1818

1919
import (
20-
"bytes"
2120
"fmt"
2221
"strings"
2322

@@ -92,8 +91,7 @@ func FromJSONFast(input []byte) (Value, error) {
9291

9392
// ToJSON is a helper function for producing a JSon document.
9493
func ToJSON(v Value) ([]byte, error) {
95-
jsonBytes, err := json.Marshal(v.Unstructured(), json.Deterministic(true))
96-
return bytes.TrimSpace(jsonBytes), err
94+
return json.Marshal(v.Unstructured(), json.Deterministic(true))
9795
}
9896

9997
// ToYAML marshals a value as YAML.

0 commit comments

Comments
 (0)