github.com/hamba/avro/v2@v2.22.1-0.20240518180522-aff3955acf7d/codec_default.go (about)

     1  package avro
     2  
     3  import (
     4  	"fmt"
     5  	"unsafe"
     6  
     7  	"github.com/modern-go/reflect2"
     8  )
     9  
    10  func createDefaultDecoder(cfg *frozenConfig, field *Field, typ reflect2.Type) ValDecoder {
    11  	fn := func(def any) ([]byte, error) {
    12  		defaultType := reflect2.TypeOf(def)
    13  		if defaultType == nil {
    14  			defaultType = reflect2.TypeOf((*null)(nil))
    15  		}
    16  		defaultEncoder := encoderOfType(cfg, field.Type(), defaultType)
    17  		if defaultType.LikePtr() {
    18  			defaultEncoder = &onePtrEncoder{defaultEncoder}
    19  		}
    20  		w := cfg.borrowWriter()
    21  		defer cfg.returnWriter(w)
    22  
    23  		defaultEncoder.Encode(reflect2.PtrOf(def), w)
    24  		if w.Error != nil {
    25  			return nil, w.Error
    26  		}
    27  		b := w.Buffer()
    28  		data := make([]byte, len(b))
    29  		copy(data, b)
    30  
    31  		return data, nil
    32  	}
    33  
    34  	b, err := field.encodeDefault(fn)
    35  	if err != nil {
    36  		return &errorDecoder{err: fmt.Errorf("decode default: %w", err)}
    37  	}
    38  	return &defaultDecoder{
    39  		data:    b,
    40  		decoder: decoderOfType(cfg, field.Type(), typ),
    41  	}
    42  }
    43  
    44  type defaultDecoder struct {
    45  	data    []byte
    46  	decoder ValDecoder
    47  }
    48  
    49  // Decode implements ValDecoder.
    50  func (d *defaultDecoder) Decode(ptr unsafe.Pointer, r *Reader) {
    51  	rr := r.cfg.borrowReader(d.data)
    52  	defer r.cfg.returnReader(rr)
    53  
    54  	d.decoder.Decode(ptr, rr)
    55  }
    56  
    57  var _ ValDecoder = &defaultDecoder{}