From 26b574790dfc0f5b10c649b4bbf7fe2dce5cf483 Mon Sep 17 00:00:00 2001 From: Tim Ramlot <42113979+inteon@users.noreply.github.com> Date: Fri, 12 Apr 2024 16:55:47 +0200 Subject: [PATCH] wip: restore API --- fieldpath/serialize-pe.go | 18 +++++++++++++++--- internal/builder/builder.go | 24 +++++++++++++++++++++++- value/fields.go | 19 ------------------- value/value.go | 4 ++-- 4 files changed, 40 insertions(+), 25 deletions(-) diff --git a/fieldpath/serialize-pe.go b/fieldpath/serialize-pe.go index 24fb5f89..0025c844 100644 --- a/fieldpath/serialize-pe.go +++ b/fieldpath/serialize-pe.go @@ -113,14 +113,26 @@ func serializePathElementToWriter(w *builder.JSONBuilder, pe PathElement) error if _, err := w.Write(peKeySepBytes); err != nil { return err } - if err := value.FieldListToJSON(*pe.Key, w); err != nil { - return err + w.WriteByte('{') + nrKeys := len(*pe.Key) + for i, f := range *pe.Key { + if err := w.WriteJSON(f.Name); err != nil { + return err + } + w.WriteByte(':') + if err := w.WriteJSON(f.Value.Unstructured()); err != nil { + return err + } + if i < nrKeys-1 { + w.WriteByte(',') + } } + w.WriteByte('}') case pe.Value != nil: if _, err := w.Write(peValueSepBytes); err != nil { return err } - if err := value.ToJSON(*pe.Value, w); err != nil { + if err := w.WriteJSON((*pe.Value).Unstructured()); err != nil { return err } case pe.Index != nil: diff --git a/internal/builder/builder.go b/internal/builder/builder.go index 6d429ff9..887ea9fd 100644 --- a/internal/builder/builder.go +++ b/internal/builder/builder.go @@ -48,7 +48,7 @@ func (w noNewlineWriter) Write(p []byte) (n int, err error) { //go:nocheckptr func noescape(p unsafe.Pointer) unsafe.Pointer { x := uintptr(p) - return unsafe.Pointer(x ^ 0) //nolint:unsafeptr + return unsafe.Pointer(x ^ 0) } func (r *JSONBuilder) WriteJSON(v interface{}) error { @@ -65,3 +65,25 @@ func (r *JSONBuilder) WriteJSON(v interface{}) error { return nil } + +func MarshalString(input string) ([]byte, error) { + out, err := gojson.Marshal((*string)(noescape(unsafe.Pointer(&input)))) + if err != nil { + return nil, err + } + + runtime.KeepAlive(input) + + return out, nil +} + +func MarshalInterface(input interface{}) ([]byte, error) { + out, err := gojson.Marshal((*interface{})(noescape(unsafe.Pointer(&input)))) + if err != nil { + return nil, err + } + + runtime.KeepAlive(input) + + return out, nil +} diff --git a/value/fields.go b/value/fields.go index 0f4cae74..65ed57d6 100644 --- a/value/fields.go +++ b/value/fields.go @@ -71,25 +71,6 @@ func FieldListFromJSON(input []byte) (FieldList, error) { return fields, nil } -// FieldListToJSON is a helper function for producing a JSON document. -func FieldListToJSON(v FieldList, w *builder.JSONBuilder) error { - w.WriteByte('{') - for i, f := range v { - if err := w.WriteJSON(f.Name); err != nil { - return err - } - w.WriteByte(':') - if err := w.WriteJSON(f.Value.Unstructured()); err != nil { - return err - } - if i < len(v)-1 { - w.WriteByte(',') - } - } - w.WriteByte('}') - return nil -} - // Sort sorts the field list by Name. func (f FieldList) Sort() { if len(f) < 2 { diff --git a/value/value.go b/value/value.go index 11d90c82..9431355d 100644 --- a/value/value.go +++ b/value/value.go @@ -85,8 +85,8 @@ func FromJSON(input []byte) (Value, error) { } // ToJSON is a helper function for producing a JSON document. -func ToJSON(v Value, w *builder.JSONBuilder) error { - return w.WriteJSON(v.Unstructured()) +func ToJSON(v Value) ([]byte, error) { + return builder.MarshalInterface(v.Unstructured()) } // ToYAML marshals a value as YAML.