9
"github.com/spf13/viper"
10
streamJSON "github.com/wal-g/json"
11
"github.com/wal-g/tracelog"
12
conf "github.com/wal-g/wal-g/internal/config"
15
type UnknownSerializerTypeError struct {
19
func NewUnknownSerializerTypeError(serializerType DtoSerializerType) UnknownSerializerTypeError {
20
return UnknownSerializerTypeError{fmt.Errorf("undefined dto serializer type: %s", serializerType)}
23
func (err UnknownSerializerTypeError) Error() string {
24
return fmt.Sprintf(tracelog.GetErrorFormatter(), err.error)
27
type DtoSerializerType string
30
RegularJSONSerializer DtoSerializerType = "json_default"
31
StreamedJSONSerializer DtoSerializerType = "json_streamed"
34
type DtoSerializer interface {
35
Marshal(dto interface{}) (io.Reader, error)
36
Unmarshal(reader io.Reader, dto interface{}) error
39
func NewDtoSerializer() (DtoSerializer, error) {
40
switch t := DtoSerializerType(viper.GetString(conf.SerializerTypeSetting)); t {
41
case RegularJSONSerializer:
42
return RegularJSON{}, nil
43
case StreamedJSONSerializer:
44
return StreamedJSON{}, nil
46
return nil, NewUnknownSerializerTypeError(t)
50
var _ DtoSerializer = RegularJSON{}
52
type RegularJSON struct{}
54
func (r RegularJSON) Marshal(dto interface{}) (io.Reader, error) {
55
data, err := json.Marshal(dto)
59
return bytes.NewReader(data), nil
62
func (r RegularJSON) Unmarshal(reader io.Reader, dto interface{}) error {
63
data, err := io.ReadAll(reader)
67
return json.Unmarshal(data, dto)
70
var _ DtoSerializer = StreamedJSON{}
72
type StreamedJSON struct{}
74
func (s StreamedJSON) Marshal(dto interface{}) (io.Reader, error) {
77
if err := streamJSON.Marshal(dto, w); err != nil {
78
_ = w.CloseWithError(err)
84
func (s StreamedJSON) Unmarshal(reader io.Reader, dto interface{}) error {
85
return streamJSON.Unmarshal(reader, dto)