Skip to content

Commit f90a164

Browse files
committed
introduce MarshalValue
Signed-off-by: Tim Ramlot <[email protected]>
1 parent f2f24ea commit f90a164

File tree

2 files changed

+58
-2
lines changed

2 files changed

+58
-2
lines changed

fieldpath/serialize-pe.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ func serializePathElementBuilder(pe PathElement, builder *bytes.Buffer) error {
124124
if _, err := builder.Write(peValueSepBytes); err != nil {
125125
return err
126126
}
127-
if err := json.MarshalWrite(builder, (*pe.Value).Unstructured(), json.Deterministic(true)); err != nil {
127+
if err := json.MarshalWrite(builder, value.MarshalValue{Value: pe.Value}, json.Deterministic(true)); err != nil {
128128
return err
129129
}
130130
case pe.Index != nil:

value/fields.go

Lines changed: 57 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,62 @@ type Field struct {
3232
Value Value
3333
}
3434

35+
type MarshalValue struct {
36+
Value *Value
37+
}
38+
39+
func (mv MarshalValue) MarshalJSONTo(enc *jsontext.Encoder) error {
40+
return valueMarshalJSONTo(enc, *mv.Value)
41+
}
42+
43+
func valueMarshalJSONTo(enc *jsontext.Encoder, v Value) error {
44+
switch {
45+
case v.IsNull():
46+
return enc.WriteToken(jsontext.Null)
47+
case v.IsFloat():
48+
return enc.WriteToken(jsontext.Float(v.AsFloat()))
49+
case v.IsInt():
50+
return enc.WriteToken(jsontext.Int(v.AsInt()))
51+
case v.IsString():
52+
return enc.WriteToken(jsontext.String(v.AsString()))
53+
case v.IsBool():
54+
return enc.WriteToken(jsontext.Bool(v.AsBool()))
55+
case v.IsList():
56+
if err := enc.WriteToken(jsontext.BeginArray); err != nil {
57+
return err
58+
}
59+
list := v.AsList()
60+
for i := 0; i < list.Length(); i++ {
61+
if err := valueMarshalJSONTo(enc, list.At(i)); err != nil {
62+
return err
63+
}
64+
}
65+
return enc.WriteToken(jsontext.EndArray)
66+
case v.IsMap():
67+
if err := enc.WriteToken(jsontext.BeginObject); err != nil {
68+
return err
69+
}
70+
var iterErr error
71+
v.AsMap().Iterate(func(k string, v Value) bool {
72+
if err := enc.WriteToken(jsontext.String(k)); err != nil {
73+
iterErr = err
74+
return false
75+
}
76+
if err := valueMarshalJSONTo(enc, v); err != nil {
77+
iterErr = err
78+
return false
79+
}
80+
return true
81+
})
82+
if iterErr != nil {
83+
return iterErr
84+
}
85+
return enc.WriteToken(jsontext.EndObject)
86+
default:
87+
return json.MarshalEncode(enc, v.Unstructured(), json.Deterministic(true))
88+
}
89+
}
90+
3591
// FieldList is a list of key-value pairs. Each field is expected to
3692
// have a different name.
3793
type FieldList []Field
@@ -42,7 +98,7 @@ func (fl *FieldList) MarshalJSONTo(enc *jsontext.Encoder) error {
4298
if err := enc.WriteToken(jsontext.String(f.Name)); err != nil {
4399
return err
44100
}
45-
if err := json.MarshalEncode(enc, f.Value.Unstructured(), json.Deterministic(true)); err != nil {
101+
if err := valueMarshalJSONTo(enc, f.Value); err != nil {
46102
return err
47103
}
48104
}

0 commit comments

Comments
 (0)