github.com/ydb-platform/ydb-go-sdk/v3@v3.89.2/internal/topic/topicreadercommon/decoders.go (about) 1 package topicreadercommon 2 3 import ( 4 "compress/gzip" 5 "errors" 6 "fmt" 7 "io" 8 9 "github.com/ydb-platform/ydb-go-sdk/v3/internal/grpcwrapper/rawtopic/rawtopiccommon" 10 "github.com/ydb-platform/ydb-go-sdk/v3/internal/xerrors" 11 ) 12 13 type DecoderMap struct { 14 m map[rawtopiccommon.Codec]PublicCreateDecoderFunc 15 } 16 17 func NewDecoderMap() DecoderMap { 18 return DecoderMap{ 19 m: map[rawtopiccommon.Codec]PublicCreateDecoderFunc{ 20 rawtopiccommon.CodecRaw: func(input io.Reader) (io.Reader, error) { 21 return input, nil 22 }, 23 rawtopiccommon.CodecGzip: func(input io.Reader) (io.Reader, error) { 24 return gzip.NewReader(input) 25 }, 26 }, 27 } 28 } 29 30 func (m *DecoderMap) AddDecoder(codec rawtopiccommon.Codec, createFunc PublicCreateDecoderFunc) { 31 m.m[codec] = createFunc 32 } 33 34 func (m *DecoderMap) Decode(codec rawtopiccommon.Codec, input io.Reader) (io.Reader, error) { 35 if f := m.m[codec]; f != nil { 36 return f(input) 37 } 38 39 return nil, xerrors.WithStackTrace(xerrors.Wrap( 40 fmt.Errorf("ydb: failed decompress message with codec %v: %w", codec, ErrPublicUnexpectedCodec), 41 )) 42 } 43 44 type PublicCreateDecoderFunc func(input io.Reader) (io.Reader, error) 45 46 // ErrPublicUnexpectedCodec return when try to read message content with unknown codec 47 var ErrPublicUnexpectedCodec = xerrors.Wrap(errors.New("ydb: unexpected codec"))