diff options
Diffstat (limited to 'vendor/github.com/hamba/avro/v2/codec_dynamic.go')
| -rw-r--r-- | vendor/github.com/hamba/avro/v2/codec_dynamic.go | 59 |
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) +} |
