gitee.com/sasukebo/go-micro/v4@v4.7.1/codec/bytes/bytes.go (about)

     1  // Package bytes provides a bytes codec which does not encode or decode anything
     2  package bytes
     3  
     4  import (
     5  	"fmt"
     6  	"io"
     7  
     8  	"gitee.com/sasukebo/go-micro/v4/codec"
     9  )
    10  
    11  type Codec struct {
    12  	Conn io.ReadWriteCloser
    13  }
    14  
    15  // Frame gives us the ability to define raw data to send over the pipes
    16  type Frame struct {
    17  	Data []byte
    18  }
    19  
    20  func (c *Codec) ReadHeader(m *codec.Message, t codec.MessageType) error {
    21  	return nil
    22  }
    23  
    24  func (c *Codec) ReadBody(b interface{}) error {
    25  	// read bytes
    26  	buf, err := io.ReadAll(c.Conn)
    27  	if err != nil {
    28  		return err
    29  	}
    30  
    31  	switch v := b.(type) {
    32  	case *[]byte:
    33  		*v = buf
    34  	case *Frame:
    35  		v.Data = buf
    36  	default:
    37  		return fmt.Errorf("failed to read body: %v is not type of *[]byte", b)
    38  	}
    39  
    40  	return nil
    41  }
    42  
    43  func (c *Codec) Write(m *codec.Message, b interface{}) error {
    44  	var v []byte
    45  	switch vb := b.(type) {
    46  	case *Frame:
    47  		v = vb.Data
    48  	case *[]byte:
    49  		v = *vb
    50  	case []byte:
    51  		v = vb
    52  	default:
    53  		return fmt.Errorf("failed to write: %v is not type of *[]byte or []byte", b)
    54  	}
    55  	_, err := c.Conn.Write(v)
    56  	return err
    57  }
    58  
    59  func (c *Codec) Close() error {
    60  	return c.Conn.Close()
    61  }
    62  
    63  func (c *Codec) String() string {
    64  	return "bytes"
    65  }
    66  
    67  func NewCodec(c io.ReadWriteCloser) codec.Codec {
    68  	return &Codec{
    69  		Conn: c,
    70  	}
    71  }