diff --git a/encoders/csv.go b/encoders/csv.go index 71915e1..adcfe81 100644 --- a/encoders/csv.go +++ b/encoders/csv.go @@ -14,28 +14,12 @@ type csvEncoder struct { // NewDecoder returns a Decoder which reads byte sequence from "r". func (e csvEncoder) NewDecoder(r io.Reader) runtime.Decoder { - return runtime.DecoderFunc(func(v interface{}) error { - raw, err := io.ReadAll(r) - if err != nil { - return err - } - return e.Unmarshal(raw, v) - }) + return newDecoderFunc(r, e) } // NewEncoder returns an Encoder which writes bytes sequence into "w". func (e csvEncoder) NewEncoder(w io.Writer) runtime.Encoder { - return runtime.EncoderFunc(func(v interface{}) error { - b, err := e.Marshal(v) - if err != nil { - return err - } - _, err = w.Write(b) - if err != nil { - return err - } - return nil - }) + return newEncoderFunc(w, e) } // ContentType returns the Content-Type which this marshaler is responsible for. diff --git a/encoders/marshaler.go b/encoders/marshaler.go index 17f442c..020cde5 100644 --- a/encoders/marshaler.go +++ b/encoders/marshaler.go @@ -3,6 +3,7 @@ package encoders import ( "context" "github.com/gazebo-web/gz-go/v8/telemetry" + "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" "go.opentelemetry.io/otel/codes" "io" ) @@ -36,3 +37,31 @@ func Unmarshal[T any](ctx context.Context, m Marshaller, body []byte) (T, error) } return value, nil } + +// newEncoderFunc returns a new runtime.EncoderFunc that uses the given Marshaller to marshal and write bytes to the +// given io.Writer. +func newEncoderFunc(w io.Writer, m Marshaller) runtime.EncoderFunc { + return func(v interface{}) error { + b, err := m.Marshal(v) + if err != nil { + return err + } + _, err = w.Write(b) + if err != nil { + return err + } + return nil + } +} + +// newDecoderFunc returns a new runtime.DecoderFunc that uses the given Marshaller to unmarshal the bytes read from +// the given io.Reader. +func newDecoderFunc(r io.Reader, m Marshaller) runtime.DecoderFunc { + return func(v interface{}) error { + raw, err := io.ReadAll(r) + if err != nil { + return err + } + return m.Unmarshal(raw, v) + } +} diff --git a/encoders/raw.go b/encoders/raw.go index a69e064..ef09826 100644 --- a/encoders/raw.go +++ b/encoders/raw.go @@ -45,28 +45,12 @@ func (e rawEncoder) Unmarshal(data []byte, v interface{}) error { // NewEncoder returns an Encoder which writes bytes sequence into "w". func (e rawEncoder) NewEncoder(w io.Writer) runtime.Encoder { - return runtime.EncoderFunc(func(v interface{}) error { - b, err := e.Marshal(v) - if err != nil { - return err - } - _, err = w.Write(b) - if err != nil { - return err - } - return nil - }) + return newEncoderFunc(w, e) } // NewDecoder returns a Decoder which reads byte sequence from "r". func (e rawEncoder) NewDecoder(r io.Reader) runtime.Decoder { - return runtime.DecoderFunc(func(v interface{}) error { - raw, err := io.ReadAll(r) - if err != nil { - return err - } - return e.Unmarshal(raw, v) - }) + return newDecoderFunc(r, e) } // ContentType returns the Content-Type which this marshaler is responsible for.