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