use std::{
fmt::{Debug, LowerHex},
io::Seek,
ops::Range,
};
use bit_cursor::{bit_cursor::BitCursor, bit_read::BitRead, bit_write::BitWrite};
use bitvec::{order::Msb0, slice::BitSlice, vec::BitVec};
pub mod rtcp;
pub mod rtp;
pub mod util;
pub trait PacketBuffer: BitRead + Seek + Debug + LowerHex {
fn position(&self) -> u64;
fn bytes_remaining(&self) -> usize;
fn sub_buffer(&self, range: Range<usize>) -> impl PacketBuffer;
}
impl PacketBuffer for BitCursor<BitVec<u8, Msb0>> {
fn position(&self) -> u64 {
BitCursor::position(self)
}
fn bytes_remaining(&self) -> usize {
self.remaining_slice().len() / 8
}
fn sub_buffer(&self, range: Range<usize>) -> impl PacketBuffer {
self.sub_cursor(range)
}
}
impl PacketBuffer for BitCursor<&BitSlice<u8, Msb0>> {
fn position(&self) -> u64 {
BitCursor::position(self)
}
fn bytes_remaining(&self) -> usize {
self.remaining_slice().len() / 8
}
fn sub_buffer(&self, range: Range<usize>) -> impl PacketBuffer {
self.sub_cursor(range)
}
}
pub trait PacketBufferMut: PacketBuffer + BitWrite {}
impl<T> PacketBufferMut for T where T: PacketBuffer + BitWrite {}