cashless2ecash

cashless2ecash: pay with cards for digital cash (experimental)
Log | Files | Refs | README

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 }