use anyhow::Result;
use byteorder::{BigEndian, WriteBytesExt};
type MessageId = u8;
type MessagePayload = Vec<u8>;
pub const MESSAGE_CHOKE: MessageId = 0;
pub const MESSAGE_UNCHOKE: MessageId = 1;
pub const MESSAGE_INTERESTED: MessageId = 2;
pub const MESSAGE_HAVE: MessageId = 4;
pub const MESSAGE_BITFIELD: MessageId = 5;
pub const MESSAGE_REQUEST: MessageId = 6;
pub const MESSAGE_PIECE: MessageId = 7;
#[derive(Default, Debug)]
pub struct Message {
id: MessageId,
payload: MessagePayload,
}
impl Message {
pub fn new(id: MessageId) -> Self {
Message {
id,
payload: vec![],
}
}
pub fn new_with_payload(id: MessageId, payload: MessagePayload) -> Self {
Message { id, payload }
}
pub fn get_id(&self) -> MessageId {
self.id
}
pub fn get_payload(&self) -> MessagePayload {
self.payload.to_vec()
}
pub fn serialize(&self) -> Result<Vec<u8>> {
let message_len = 1 + self.payload.len();
let mut serialized: Vec<u8> = vec![];
serialized.write_u32::<BigEndian>(message_len as u32)?;
serialized.push(self.id);
let mut payload = self.payload.clone();
serialized.append(&mut payload);
Ok(serialized)
}
}
pub fn deserialize_message(message_buf: &Vec<u8>, message_len: usize) -> Result<Message> {
let id: MessageId = message_buf[0];
let payload: MessagePayload = message_buf[1..message_len].to_vec();
let message: Message = Message::new_with_payload(id, payload);
Ok(message)
}