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

     1  // Package proto provides a proto codec
     2  package proto
     3  
     4  import (
     5  	"io"
     6  
     7  	"gitee.com/sasukebo/go-micro/v4/codec"
     8  	"github.com/golang/protobuf/proto"
     9  )
    10  
    11  type Codec struct {
    12  	Conn io.ReadWriteCloser
    13  }
    14  
    15  func (c *Codec) ReadHeader(m *codec.Message, t codec.MessageType) error {
    16  	return nil
    17  }
    18  
    19  func (c *Codec) ReadBody(b interface{}) error {
    20  	if b == nil {
    21  		return nil
    22  	}
    23  	buf, err := io.ReadAll(c.Conn)
    24  	if err != nil {
    25  		return err
    26  	}
    27  	m, ok := b.(proto.Message)
    28  	if !ok {
    29  		return codec.ErrInvalidMessage
    30  	}
    31  	return proto.Unmarshal(buf, m)
    32  }
    33  
    34  func (c *Codec) Write(m *codec.Message, b interface{}) error {
    35  	if b == nil {
    36  		// Nothing to write
    37  		return nil
    38  	}
    39  	p, ok := b.(proto.Message)
    40  	if !ok {
    41  		return codec.ErrInvalidMessage
    42  	}
    43  	buf, err := proto.Marshal(p)
    44  	if err != nil {
    45  		return err
    46  	}
    47  	_, err = c.Conn.Write(buf)
    48  	return err
    49  }
    50  
    51  func (c *Codec) Close() error {
    52  	return c.Conn.Close()
    53  }
    54  
    55  func (c *Codec) String() string {
    56  	return "proto"
    57  }
    58  
    59  func NewCodec(c io.ReadWriteCloser) codec.Codec {
    60  	return &Codec{
    61  		Conn: c,
    62  	}
    63  }