use byteorder_slice::{BigEndian, LittleEndian};
use super::RawPcapPacket;
use crate::Endianness;
use crate::pcap::PcapHeader;
use crate::pcap::PcapPacket;
use crate::pcap::PcapParseError;
#[derive(Debug)]
pub struct PcapParser {
header: PcapHeader,
}
impl PcapParser {
pub fn new(slice: &[u8]) -> Result<(&[u8], PcapParser), PcapParseError> {
let (slice, header) = PcapHeader::from_slice(slice)?;
let parser = PcapParser { header };
Ok((slice, parser))
}
pub fn next_packet<'a>(&self, slice: &'a [u8]) -> Result<(&'a [u8], PcapPacket<'a>), PcapParseError> {
let res = match self.header.endianness {
Endianness::Big => RawPcapPacket::from_slice::<BigEndian>(slice),
Endianness::Little => RawPcapPacket::from_slice::<LittleEndian>(slice),
};
let header = &self.header;
res.and_then(|(rem, raw_pkt)| {
raw_pkt
.try_into_pcap_packet(header.ts_resolution, header.snaplen)
.map(|pkt| (rem, pkt))
.map_err(|e| e.into())
})
}
pub fn next_raw_packet<'a>(&self, slice: &'a [u8]) -> Result<(&'a [u8], RawPcapPacket<'a>), PcapParseError> {
match self.header.endianness {
Endianness::Big => RawPcapPacket::from_slice::<BigEndian>(slice),
Endianness::Little => RawPcapPacket::from_slice::<LittleEndian>(slice),
}
}
pub fn header(&self) -> PcapHeader {
self.header
}
}