Skip to content

Commit e4c71fb

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

File tree

3 files changed

+59
-58
lines changed

3 files changed

+59
-58
lines changed

fieldpath/serialize-pe.go

Lines changed: 2 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,12 @@ limitations under the License.
1717
package fieldpath
1818

1919
import (
20-
"bytes"
2120
"errors"
2221
"fmt"
23-
"io"
2422
"strconv"
2523
"strings"
2624

2725
"github.com/go-json-experiment/json"
28-
"github.com/go-json-experiment/json/jsontext"
2926
"sigs.k8s.io/structured-merge-diff/v6/value"
3027
)
3128

@@ -55,47 +52,6 @@ var (
5552
peKeySepBytes = []byte{peKey, peSeparator}
5653
)
5754

58-
// FieldListFromJSON is a helper function for reading a JSON document.
59-
func fieldListFromJSON(input []byte) (value.FieldList, error) {
60-
parser := jsontext.NewDecoder(bytes.NewBuffer(input))
61-
62-
if objStart, err := parser.ReadToken(); err != nil {
63-
return nil, fmt.Errorf("parsing JSON: %v", err)
64-
} else if objStart.Kind() != jsontext.BeginObject.Kind() {
65-
return nil, fmt.Errorf("expected object")
66-
}
67-
68-
var fields value.FieldList
69-
for {
70-
if parser.PeekKind() == jsontext.EndObject.Kind() {
71-
if _, err := parser.ReadToken(); err != nil {
72-
return nil, fmt.Errorf("parsing JSON: %v", err)
73-
}
74-
break
75-
}
76-
77-
rawKey, err := parser.ReadToken()
78-
if err == io.EOF {
79-
return nil, fmt.Errorf("unexpected EOF")
80-
} else if err != nil {
81-
return nil, fmt.Errorf("parsing JSON: %v", err)
82-
}
83-
84-
k := rawKey.String()
85-
86-
var v any
87-
if err := json.UnmarshalDecode(parser, &v); err == io.EOF {
88-
return nil, fmt.Errorf("unexpected EOF")
89-
} else if err != nil {
90-
return nil, fmt.Errorf("parsing JSON: %v", err)
91-
}
92-
93-
fields = append(fields, value.Field{Name: k, Value: value.NewValueInterface(v)})
94-
}
95-
96-
return fields, nil
97-
}
98-
9955
// DeserializePathElement parses a serialized path element
10056
func DeserializePathElement(s string) (PathElement, error) {
10157
b := []byte(s)
@@ -121,11 +77,10 @@ func DeserializePathElement(s string) (PathElement, error) {
12177
}
12278
return PathElement{Value: &v}, nil
12379
case peKeySepBytes[0]:
124-
fields, err := fieldListFromJSON(b)
125-
if err != nil {
80+
var fields value.FieldList
81+
if err := json.Unmarshal(b, &fields); err != nil {
12682
return PathElement{}, err
12783
}
128-
fields.Sort()
12984
return PathElement{Key: &fields}, nil
13085
case peIndexSepBytes[0]:
13186
i, err := strconv.Atoi(s[2:])

fieldpath/serialize.go

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -128,24 +128,21 @@ func (s *setContentsV1) emitContentsV1(includeSelf bool, om *jsontext.Encoder) e
128128
return nil
129129
}
130130

131-
// FromJSON clears s and reads a JSON formatted set structure.
132-
func (s *Set) FromJSON(r io.Reader) error {
133-
parser := jsontext.NewDecoder(r)
134-
135-
found, _, err := readIterV1(parser)
131+
func (s *setContentsV1) UnmarshalJSONFrom(dec *jsontext.Decoder) error {
132+
found, _, err := s.readIterV1(dec)
136133
if err != nil {
137134
return err
138135
} else if found == nil {
139-
*s = Set{}
136+
*(*Set)(s) = Set{}
140137
} else {
141-
*s = *found
138+
*(*Set)(s) = *found
142139
}
143140
return nil
144141
}
145142

146143
// returns true if this subtree is also (or only) a member of parent; s is nil
147144
// if there are no further children.
148-
func readIterV1(parser *jsontext.Decoder) (children *Set, isMember bool, err error) {
145+
func (s *setContentsV1) readIterV1(parser *jsontext.Decoder) (children *Set, isMember bool, err error) {
149146
if objStart, err := parser.ReadToken(); err != nil {
150147
return nil, false, fmt.Errorf("parsing JSON: %v", err)
151148
} else if objStart.Kind() != jsontext.BeginObject.Kind() {
@@ -188,7 +185,7 @@ func readIterV1(parser *jsontext.Decoder) (children *Set, isMember bool, err err
188185
return nil, false, fmt.Errorf("parsing key as path element: %v", err)
189186
}
190187

191-
grandChildren, isChildMember, err := readIterV1(parser)
188+
grandChildren, isChildMember, err := s.readIterV1(parser)
192189
if err != nil {
193190
return nil, false, fmt.Errorf("parsing value as set: %v", err)
194191
}
@@ -226,3 +223,8 @@ func readIterV1(parser *jsontext.Decoder) (children *Set, isMember bool, err err
226223

227224
return children, isMember, nil
228225
}
226+
227+
// FromJSON clears s and reads a JSON formatted set structure.
228+
func (s *Set) FromJSON(r io.Reader) error {
229+
return json.UnmarshalRead(r, (*setContentsV1)(s))
230+
}

value/fields.go

Lines changed: 46 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ limitations under the License.
1717
package value
1818

1919
import (
20+
"fmt"
21+
"io"
2022
"sort"
2123
"strings"
2224

@@ -34,9 +36,9 @@ type Field struct {
3436
// have a different name.
3537
type FieldList []Field
3638

37-
func (fl FieldList) MarshalJSONTo(enc *jsontext.Encoder) error {
39+
func (fl *FieldList) MarshalJSONTo(enc *jsontext.Encoder) error {
3840
enc.WriteToken(jsontext.BeginObject)
39-
for _, f := range fl {
41+
for _, f := range *fl {
4042
if err := enc.WriteToken(jsontext.String(f.Name)); err != nil {
4143
return err
4244
}
@@ -49,6 +51,48 @@ func (fl FieldList) MarshalJSONTo(enc *jsontext.Encoder) error {
4951
return nil
5052
}
5153

54+
// FieldListFromJSON is a helper function for reading a JSON document.
55+
func (fl *FieldList) UnmarshalJSONFrom(parser *jsontext.Decoder) error {
56+
if objStart, err := parser.ReadToken(); err != nil {
57+
return fmt.Errorf("parsing JSON: %v", err)
58+
} else if objStart.Kind() != jsontext.BeginObject.Kind() {
59+
return fmt.Errorf("expected object")
60+
}
61+
62+
var fields FieldList
63+
for {
64+
if parser.PeekKind() == jsontext.EndObject.Kind() {
65+
if _, err := parser.ReadToken(); err != nil {
66+
return fmt.Errorf("parsing JSON: %v", err)
67+
}
68+
break
69+
}
70+
71+
rawKey, err := parser.ReadToken()
72+
if err == io.EOF {
73+
return fmt.Errorf("unexpected EOF")
74+
} else if err != nil {
75+
return fmt.Errorf("parsing JSON: %v", err)
76+
}
77+
78+
k := rawKey.String()
79+
80+
var v any
81+
if err := json.UnmarshalDecode(parser, &v); err == io.EOF {
82+
return fmt.Errorf("unexpected EOF")
83+
} else if err != nil {
84+
return fmt.Errorf("parsing JSON: %v", err)
85+
}
86+
87+
fields = append(fields, Field{Name: k, Value: NewValueInterface(v)})
88+
}
89+
90+
fields.Sort()
91+
*fl = fields
92+
93+
return nil
94+
}
95+
5296
// Copy returns a copy of the FieldList.
5397
// Values are not copied.
5498
func (f FieldList) Copy() FieldList {

0 commit comments

Comments
 (0)