use bytes::Bytes;
use core::fmt;
mod deserialize;
mod extension;
mod handle;
mod serialize;
mod time;
pub use extension::*;
pub use handle::*;
pub use time::*;
#[derive(Clone)]
pub struct Packet {
pub header: Header,
pub payload: Bytes,
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(test, derive(fake::Dummy))]
pub struct Header {
pub marker: FrameMarker,
pub track_handle: Handle,
pub sequence: u16,
pub frame_number: u16,
pub timestamp: Timestamp<90_000>,
pub extensions: Extensions,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(test, derive(fake::Dummy))]
pub enum FrameMarker {
Start,
Inter,
Final,
Single,
}
impl fmt::Debug for Packet {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("Packet")
.field("header", &self.header)
.field("payload_len", &self.payload.len())
.finish()
}
}
pub(crate) mod consts {
pub const SUPPORTED_VERSION: u8 = 0;
pub const BASE_HEADER_LEN: usize = 12;
pub const VERSION_SHIFT: u8 = 5;
pub const VERSION_MASK: u8 = 0x07;
pub const FRAME_MARKER_SHIFT: u8 = 3;
pub const FRAME_MARKER_MASK: u8 = 0x3;
pub const FRAME_MARKER_START: u8 = 0x2;
pub const FRAME_MARKER_FINAL: u8 = 0x1;
pub const FRAME_MARKER_INTER: u8 = 0x0;
pub const FRAME_MARKER_SINGLE: u8 = 0x3;
pub const EXT_WORDS_INDICATOR_SIZE: usize = 2;
pub const EXT_FLAG_SHIFT: u8 = 0x2;
pub const EXT_FLAG_MASK: u8 = 0x1;
pub const EXT_MARKER_LEN: usize = 2;
pub const EXT_TAG_PADDING: u8 = 0;
}
#[cfg(test)]
mod tests {
use super::Packet;
use fake::{Fake, Faker};
#[test]
fn test_roundtrip() {
let original: Packet = Faker.fake();
let header = original.header.clone();
let payload = original.payload.clone();
let serialized = original.serialize();
let deserialized = Packet::deserialize(serialized).unwrap();
assert_eq!(deserialized.header, header);
assert_eq!(deserialized.payload, payload);
}
}