use std::convert::TryInto; use std::io::{self, BufReader, ErrorKind, Read}; use std::net::TcpStream; pub enum MessageBody { Version(u32), NewCore(String, Vec), Job(u64, Vec), } pub enum Reply { Version(bool), NewCore, Job(i32, Vec), } pub struct RawMessage { pub typ: u8, pub id: u64, pub payload: Vec, } impl RawMessage { pub fn receive(reader: &mut BufReader) -> io::Result> { let mut header = [0u8; 17]; if let Err(e) = reader.read_exact(&mut header) { if e.kind() == ErrorKind::UnexpectedEof { return Ok(None); } else { return Err(e); } } let typ = header[0]; let id = u64::from_le_bytes(header[1..9].try_into().unwrap()); let length = usize::from_le_bytes(header[9..17].try_into().unwrap()); let mut payload = Vec::new(); payload.resize(length, 0u8); if let Err(e) = reader.read_exact(&mut payload) { if e.kind() == ErrorKind::UnexpectedEof { return Ok(None); } else { return Err(e); } } Ok(Some(Self { typ, id, payload })) } }