package avro

import (
	
	
	

	
)

type efaceDecoder struct {
	schema Schema
	typ    reflect2.Type
	dec    ValDecoder
}

func newEfaceDecoder( *decoderContext,  Schema) *efaceDecoder {
	,  := genericReceiver()
	 := decoderOfType(, , )

	return &efaceDecoder{
		schema: ,
		typ:    ,
		dec:    ,
	}
}

func ( *efaceDecoder) ( unsafe.Pointer,  *Reader) {
	 := (*any)()

	defer func() {
		,  := .cfg.typeConverters.DecodeTypeConvert(*, .schema)
		if  != nil && !errors.Is(, errNoTypeConverter) {
			.Error = 
		}
		* = 
	}()

	if * == nil {
		* = genericDecode(.typ, .dec, )
		return
	}

	 := reflect2.TypeOf(*)
	if .Kind() != reflect.Ptr {
		* = genericDecode(.typ, .dec, )
		return
	}

	 := .(*reflect2.UnsafePtrType)
	 := .Elem()
	if reflect2.IsNil(*) {
		 := .New()
		.ReadVal(.schema, )
		* = 
		return
	}
	.ReadVal(.schema, *)
}

type interfaceEncoder struct {
	schema Schema
	typ    reflect2.Type
}

func ( *interfaceEncoder) ( unsafe.Pointer,  *Writer) {
	 := .typ.UnsafeIndirect()

	,  := .cfg.typeConverters.EncodeTypeConvert(, .schema)
	if  != nil && !errors.Is(, errNoTypeConverter) {
		.Error = 
		return
	}

	.WriteVal(.schema, )
}