diff --git a/message/message.go b/message/message.go index 9ad3122..09f0a2c 100644 --- a/message/message.go +++ b/message/message.go @@ -1,6 +1,9 @@ package message -import "encoding/binary" +import ( + "encoding/binary" + "io" +) type messageID uint8 @@ -32,3 +35,26 @@ func (m *Message) Serialize() []byte { copy(buf[5:], m.payload) return buf } + +func Read(r io.Reader) (*Message, error) { + lengthBuf := make([]byte, 4) + _, err := io.ReadFull(r, lengthBuf) + if err != nil { + return nil, err + } + length := binary.BigEndian.Uint32(lengthBuf) + + if length == 0 { + return nil, nil + } + messageBuf := make([]byte, length) + _, err = io.ReadFull(r, messageBuf) + if err != nil { + return nil, err + } + m := &Message{ + ID: messageID(messageBuf[0]), + payload: messageBuf[1:], + } + return m, nil +}