go_dreamfactory/lego/utils/codec/codec.go

71 lines
1.7 KiB
Go

package codec
import (
"sync"
"go_dreamfactory/lego/utils/codec/codecore"
"go_dreamfactory/lego/utils/codec/factory"
"github.com/modern-go/reflect2"
)
var decoderCache = new(sync.Map)
var encoderCache = new(sync.Map)
func AddDecoder(cacheKey uintptr, decoder codecore.IDecoder) {
decoderCache.Store(cacheKey, decoder)
}
func AddEncoder(cacheKey uintptr, encoder codecore.IEncoder) {
encoderCache.Store(cacheKey, encoder)
}
func GetEncoder(cacheKey uintptr) codecore.IEncoder {
encoder, found := encoderCache.Load(cacheKey)
if found {
return encoder.(codecore.IEncoder)
}
return nil
}
func GetDecoder(cacheKey uintptr) codecore.IDecoder {
decoder, found := decoderCache.Load(cacheKey)
if found {
return decoder.(codecore.IDecoder)
}
return nil
}
func EncoderOf(typ reflect2.Type, config *codecore.Config) codecore.IEncoder {
cacheKey := typ.RType()
encoder := GetEncoder(cacheKey)
if encoder != nil {
return encoder
}
ctx := &codecore.Ctx{
Config: config,
Prefix: "",
Decoders: map[reflect2.Type]codecore.IDecoder{},
Encoders: map[reflect2.Type]codecore.IEncoder{},
}
encoder = factory.EncoderOfType(ctx, typ)
if typ.LikePtr() {
encoder = factory.NewonePtrEncoder(encoder)
}
AddEncoder(cacheKey, encoder)
return encoder
}
func DecoderOf(typ reflect2.Type, config *codecore.Config) codecore.IDecoder {
cacheKey := typ.RType()
decoder := GetDecoder(cacheKey)
if decoder != nil {
return decoder
}
ctx := &codecore.Ctx{
Config: config,
Prefix: "",
Decoders: map[reflect2.Type]codecore.IDecoder{},
Encoders: map[reflect2.Type]codecore.IEncoder{},
}
ptrType := typ.(*reflect2.UnsafePtrType)
decoder = factory.DecoderOfType(ctx, ptrType.Elem())
AddDecoder(cacheKey, decoder)
return decoder
}