package avro
import (
"errors"
"sync"
)
var errNoTypeConverter = errors .New ("no type converter" )
type TypeConverter interface {
Type () Type
LogicalType () LogicalType
EncodeTypeConvert (in any , schema Schema ) (any , error )
DecodeTypeConvert (in any , schema Schema ) (any , error )
}
type specificType struct {
typ Type
lt LogicalType
}
type TypeConverters struct {
convs sync .Map
}
func NewTypeConverters () *TypeConverters {
return &TypeConverters {}
}
func (c *TypeConverters ) RegisterTypeConverters (convs ...TypeConverter ) {
for _ , conv := range convs {
if typ := conv .Type (); len (typ ) == 0 {
continue
}
c .convs .Store (specificType {typ : conv .Type (), lt : conv .LogicalType ()}, conv )
}
}
func (c *TypeConverters ) EncodeTypeConvert (in any , schema Schema ) (any , error ) {
conv , ok := c .getTypeConverter (schema )
if !ok {
return in , errNoTypeConverter
}
return conv .EncodeTypeConvert (in , schema )
}
func (c *TypeConverters ) DecodeTypeConvert (in any , schema Schema ) (any , error ) {
conv , ok := c .getTypeConverter (schema )
if !ok {
return in , errNoTypeConverter
}
return conv .DecodeTypeConvert (in , schema )
}
func (c *TypeConverters ) getTypeConverter (schema Schema ) (TypeConverter , bool ) {
typ := schema .Type ()
lt := getLogicalType (schema )
conv , ok := c .convs .Load (specificType {typ : typ , lt : lt })
if !ok {
return nil , false
}
return conv .(TypeConverter ), ok
}
func RegisterTypeConverters (convs ...TypeConverter ) {
DefaultConfig .RegisterTypeConverters (convs ...)
}
type TypeConversionFuncs struct {
AvroType Type
AvroLogicalType LogicalType
EncoderTypeConversion func (in any , schema Schema ) (any , error )
DecoderTypeConversion func (in any , schema Schema ) (any , error )
}
func (c TypeConversionFuncs ) Type () Type {
return c .AvroType
}
func (c TypeConversionFuncs ) LogicalType () LogicalType {
return c .AvroLogicalType
}
func (c TypeConversionFuncs ) EncodeTypeConvert (in any , schema Schema ) (any , error ) {
if c .EncoderTypeConversion == nil {
return in , errNoTypeConverter
}
return c .EncoderTypeConversion (in , schema )
}
func (c TypeConversionFuncs ) DecodeTypeConvert (in any , schema Schema ) (any , error ) {
if c .DecoderTypeConversion == nil {
return in , errNoTypeConverter
}
return c .DecoderTypeConversion (in , schema )
}
The pages are generated with Golds v0.8.2 . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds .