use byteorder::{BigEndian, LittleEndian};
use super::RawCapPacket;
use crate::cap::{CapHeader, CapPacket};
use crate::errors::*;
use crate::Endianness;
#[derive(Debug)]
pub struct CapParser {
header: CapHeader,
}
impl CapParser {
pub fn new(slice: &[u8]) -> PcapResult<(&[u8], CapParser)> {
let (slice, header) = CapHeader::from_slice(slice)?;
let parser = CapParser { header };
Ok((slice, parser))
}
#[cfg(feature = "tokio")]
pub async fn async_new(slice: &[u8]) -> PcapResult<(&[u8], CapParser)> {
let (slice, header) = CapHeader::async_from_slice(slice).await?;
let parser = CapParser { header };
Ok((slice, parser))
}
pub fn next_packet<'a>(&self, slice: &'a [u8]) -> PcapResult<(&'a [u8], CapPacket<'a>)> {
match self.header.endianness {
Endianness::Big => CapPacket::from_slice::<BigEndian>(slice, self.header.start_time),
Endianness::Little => CapPacket::from_slice::<LittleEndian>(slice, self.header.start_time),
}
}
#[cfg(feature = "tokio")]
pub async fn async_next_packet<'a>(&self, slice: &'a [u8]) -> PcapResult<(&'a [u8], CapPacket<'a>)> {
match self.header.endianness {
Endianness::Big => CapPacket::async_from_slice::<BigEndian>(slice, self.header.start_time).await,
Endianness::Little => CapPacket::async_from_slice::<LittleEndian>(slice, self.header.start_time).await,
}
}
pub fn next_raw_packet<'a>(&self, slice: &'a [u8]) -> PcapResult<(&'a [u8], RawCapPacket<'a>)> {
match self.header.endianness {
Endianness::Big => RawCapPacket::from_slice::<BigEndian>(slice),
Endianness::Little => RawCapPacket::from_slice::<LittleEndian>(slice),
}
}
#[cfg(feature = "tokio")]
pub async fn async_next_raw_packet<'a>(&self, slice: &'a [u8]) -> PcapResult<(&'a [u8], RawCapPacket<'a>)> {
match self.header.endianness {
Endianness::Big => RawCapPacket::async_from_slice::<BigEndian>(slice).await,
Endianness::Little => RawCapPacket::async_from_slice::<LittleEndian>(slice).await,
}
}
pub fn header(&self) -> CapHeader {
self.header
}
}