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{}