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