package fcast import ( "encoding/binary" "errors" ) type OpCode uint8 type MessageHeader struct { Size uint32 // little endian (4) 0-3 OpCode OpCode // (1) 4-4 } type RawMessage struct { Header MessageHeader // 0-4 Body []byte // 5- } func NewMessage(op OpCode, body []byte) *RawMessage { return &RawMessage{ Header: MessageHeader{ Size: uint32(len(body) + 1), OpCode: op, }, Body: body, } } func SerializeRaw(message *RawMessage) []byte { buf := make([]byte, 4+message.Header.Size) binary.LittleEndian.PutUint32(buf[0:4], message.Header.Size) buf[4] = byte(message.Header.OpCode) copy(buf[5:], message.Body) return buf } var ( ErrHeaderTooShort = errors.New("header is too short") ErrBodyTooShort = errors.New("body is too short") ) func DeserializeRaw(bodyLen, opCode, body []byte) (*RawMessage, error) { var msg RawMessage msg.Header.Size = binary.LittleEndian.Uint32(bodyLen) msg.Header.OpCode = OpCode(uint8(opCode[0])) msg.Body = body return &msg, nil }