use std::io::{Cursor, Error, ErrorKind};
use bytes::{Buf, BytesMut};
pub mod event;
pub mod header;
pub mod lap;
pub mod motion;
pub mod participants;
pub mod session;
pub mod setup;
pub mod status;
pub mod telemetry;
#[derive(Debug, PartialEq, Clone, PartialOrd)]
pub enum Packet {
Event(event::EventPacket),
Lap(lap::LapPacket),
Motion(motion::MotionPacket),
Participants(participants::ParticipantsPacket),
Session(session::SessionPacket),
Setup(setup::CarSetupPacket),
Status(status::CarStatusPacket),
Telemetry(telemetry::TelemetryPacket),
}
pub(crate) fn ensure_packet_size(
expected_size: usize,
cursor: &mut Cursor<&mut BytesMut>,
) -> Result<(), Error> {
if cursor.remaining() < expected_size {
Err(Error::new(
ErrorKind::UnexpectedEof,
format!(
"Packet is expected to have a size of {} bytes, but was {}.",
expected_size,
cursor.remaining()
),
))
} else {
Ok(())
}
}
#[cfg(test)]
mod tests {
use std::io::{Cursor, Error};
use bytes::{Buf, BufMut, BytesMut};
use crate::packet::ensure_packet_size;
struct Packet {
counter: u8,
}
const PACKET_SIZE: usize = 1;
fn decode_packet(cursor: &mut Cursor<&mut BytesMut>) -> Result<Packet, Error> {
ensure_packet_size(PACKET_SIZE, cursor)?;
Ok(Packet {
counter: cursor.get_u8(),
})
}
#[test]
fn ensure_packet_size_correctly() {
let mut bytes = BytesMut::with_capacity(1);
bytes.put_u8(0);
let mut cursor = Cursor::new(&mut bytes);
let packet = decode_packet(&mut cursor).unwrap();
assert_eq!(0, packet.counter);
}
#[test]
fn ensure_packet_size_with_error() {
let mut bytes = BytesMut::with_capacity(0);
let mut cursor = Cursor::new(&mut bytes);
let packet = decode_packet(&mut cursor);
assert!(packet.is_err());
}
}