summaryrefslogtreecommitdiff
path: root/vendor/github.com/hamba/avro/v2/codec_marshaler.go
diff options
context:
space:
mode:
authormo khan <mo@mokhan.ca>2025-07-22 17:35:49 -0600
committermo khan <mo@mokhan.ca>2025-07-22 17:35:49 -0600
commit20ef0d92694465ac86b550df139e8366a0a2b4fa (patch)
tree3f14589e1ce6eb9306a3af31c3a1f9e1af5ed637 /vendor/github.com/hamba/avro/v2/codec_marshaler.go
parent44e0d272c040cdc53a98b9f1dc58ae7da67752e6 (diff)
feat: connect to spicedb
Diffstat (limited to 'vendor/github.com/hamba/avro/v2/codec_marshaler.go')
-rw-r--r--vendor/github.com/hamba/avro/v2/codec_marshaler.go70
1 files changed, 70 insertions, 0 deletions
diff --git a/vendor/github.com/hamba/avro/v2/codec_marshaler.go b/vendor/github.com/hamba/avro/v2/codec_marshaler.go
new file mode 100644
index 0000000..d783d17
--- /dev/null
+++ b/vendor/github.com/hamba/avro/v2/codec_marshaler.go
@@ -0,0 +1,70 @@
+package avro
+
+import (
+ "encoding"
+ "unsafe"
+
+ "github.com/modern-go/reflect2"
+)
+
+var (
+ textMarshalerType = reflect2.TypeOfPtr((*encoding.TextMarshaler)(nil)).Elem()
+ textUnmarshalerType = reflect2.TypeOfPtr((*encoding.TextUnmarshaler)(nil)).Elem()
+)
+
+func createDecoderOfMarshaler(schema Schema, typ reflect2.Type) ValDecoder {
+ if typ.Implements(textUnmarshalerType) && schema.Type() == String {
+ return &textMarshalerCodec{typ}
+ }
+ ptrType := reflect2.PtrTo(typ)
+ if ptrType.Implements(textUnmarshalerType) && schema.Type() == String {
+ return &referenceDecoder{
+ &textMarshalerCodec{ptrType},
+ }
+ }
+ return nil
+}
+
+func createEncoderOfMarshaler(schema Schema, typ reflect2.Type) ValEncoder {
+ if typ.Implements(textMarshalerType) && schema.Type() == String {
+ return &textMarshalerCodec{
+ typ: typ,
+ }
+ }
+ return nil
+}
+
+type textMarshalerCodec struct {
+ typ reflect2.Type
+}
+
+func (c textMarshalerCodec) Decode(ptr unsafe.Pointer, r *Reader) {
+ obj := c.typ.UnsafeIndirect(ptr)
+ if reflect2.IsNil(obj) {
+ ptrType := c.typ.(*reflect2.UnsafePtrType)
+ newPtr := ptrType.Elem().UnsafeNew()
+ *((*unsafe.Pointer)(ptr)) = newPtr
+ obj = c.typ.UnsafeIndirect(ptr)
+ }
+ unmarshaler := (obj).(encoding.TextUnmarshaler)
+ b := r.ReadBytes()
+ err := unmarshaler.UnmarshalText(b)
+ if err != nil {
+ r.ReportError("textMarshalerCodec", err.Error())
+ }
+}
+
+func (c textMarshalerCodec) Encode(ptr unsafe.Pointer, w *Writer) {
+ obj := c.typ.UnsafeIndirect(ptr)
+ if c.typ.IsNullable() && reflect2.IsNil(obj) {
+ w.WriteBytes(nil)
+ return
+ }
+ marshaler := (obj).(encoding.TextMarshaler)
+ b, err := marshaler.MarshalText()
+ if err != nil {
+ w.Error = err
+ return
+ }
+ w.WriteBytes(b)
+}