summaryrefslogtreecommitdiff
path: root/vendor/github.com/hamba/avro/v2/codec_dynamic.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_dynamic.go
parent44e0d272c040cdc53a98b9f1dc58ae7da67752e6 (diff)
feat: connect to spicedb
Diffstat (limited to 'vendor/github.com/hamba/avro/v2/codec_dynamic.go')
-rw-r--r--vendor/github.com/hamba/avro/v2/codec_dynamic.go59
1 files changed, 59 insertions, 0 deletions
diff --git a/vendor/github.com/hamba/avro/v2/codec_dynamic.go b/vendor/github.com/hamba/avro/v2/codec_dynamic.go
new file mode 100644
index 0000000..f14a04e
--- /dev/null
+++ b/vendor/github.com/hamba/avro/v2/codec_dynamic.go
@@ -0,0 +1,59 @@
+package avro
+
+import (
+ "reflect"
+ "unsafe"
+
+ "github.com/modern-go/reflect2"
+)
+
+type efaceDecoder struct {
+ schema Schema
+ typ reflect2.Type
+ dec ValDecoder
+}
+
+func newEfaceDecoder(d *decoderContext, schema Schema) *efaceDecoder {
+ typ, _ := genericReceiver(schema)
+ dec := decoderOfType(d, schema, typ)
+
+ return &efaceDecoder{
+ schema: schema,
+ typ: typ,
+ dec: dec,
+ }
+}
+
+func (d *efaceDecoder) Decode(ptr unsafe.Pointer, r *Reader) {
+ pObj := (*any)(ptr)
+ if *pObj == nil {
+ *pObj = genericDecode(d.typ, d.dec, r)
+ return
+ }
+
+ typ := reflect2.TypeOf(*pObj)
+ if typ.Kind() != reflect.Ptr {
+ *pObj = genericDecode(d.typ, d.dec, r)
+ return
+ }
+
+ ptrType := typ.(*reflect2.UnsafePtrType)
+ ptrElemType := ptrType.Elem()
+ if reflect2.IsNil(*pObj) {
+ obj := ptrElemType.New()
+ r.ReadVal(d.schema, obj)
+ *pObj = obj
+ return
+ }
+ r.ReadVal(d.schema, *pObj)
+}
+
+type interfaceEncoder struct {
+ schema Schema
+ typ reflect2.Type
+}
+
+func (e *interfaceEncoder) Encode(ptr unsafe.Pointer, w *Writer) {
+ obj := e.typ.UnsafeIndirect(ptr)
+ w.WriteVal(e.schema, obj)
+}