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"))