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 }