codec.go (919B)
1 package main 2 3 import ( 4 "bytes" 5 "encoding/json" 6 "io" 7 ) 8 9 type Codec[T any] interface { 10 HttpApplicationContentHeader() string 11 Encode(*T) (io.Reader, error) 12 EncodeToBytes(body *T) ([]byte, error) 13 Decode(io.Reader) (*T, error) 14 } 15 16 type JsonCodec[T any] struct { 17 Codec[T] 18 } 19 20 func NewJsonCodec[T any]() Codec[T] { 21 22 return new(JsonCodec[T]) 23 } 24 25 func (*JsonCodec[T]) Encode(body *T) (io.Reader, error) { 26 27 encodedBytes, err := json.Marshal(body) 28 if err != nil { 29 return nil, err 30 } 31 32 return bytes.NewReader(encodedBytes), err 33 } 34 35 func (c *JsonCodec[T]) EncodeToBytes(body *T) ([]byte, error) { 36 37 reader, err := c.Encode(body) 38 if err != nil { 39 return make([]byte, 0), err 40 } 41 buf, err := io.ReadAll(reader) 42 if err != nil { 43 return make([]byte, 0), err 44 } 45 return buf, nil 46 } 47 48 func (*JsonCodec[T]) Decode(reader io.Reader) (*T, error) { 49 50 body := new(T) 51 err := json.NewDecoder(reader).Decode(body) 52 return body, err 53 }