cashless2ecash

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

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 }