use std::error;
use std::fmt;
use std::io;
use std::time;
const UNKNOWN_MAGIC: &str = "unknown snoop magic bytes";
const UNKNOWN_VERSION: &str = "unknown snoop format version";
const ORIGINAL_LEN_EXCEEDED: &str = "capture length exceeds original packet length";
const CAPTURE_LEN_EXCEEDED: &str = "capture length exceeds max capture length";
const INVALID_RECORD_LENGTH: &str = "invalid record length calculation with original len";
const INVALID_PAD_LENGTH: &str =
"invalid pad length. only 4 bytes as pads are supported in this implementation";
const EOF: &str = "end of file";
const UNEXEOF: &str = "unexpected end of file";
const TIME_EPOCH_EXEEDED: &str = "u32 time epoch exeeded use u64 instad";
#[derive(Debug)]
pub enum Error {
UnknownMagic,
UnknownVersion,
OriginalLenExceeded,
CaptureLenExceeded,
InvalidRecordLength,
InvalidPadLen,
Eof,
UnexpectedEof(usize),
Io(io::Error),
Time(time::SystemTimeError),
TimeEpoch,
}
impl fmt::Display for Error {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match self {
Error::UnknownMagic => write!(f, "{UNKNOWN_MAGIC}"),
Error::UnknownVersion => write!(f, "{UNKNOWN_VERSION}"),
Error::OriginalLenExceeded => write!(f, "{ORIGINAL_LEN_EXCEEDED}"),
Error::CaptureLenExceeded => write!(f, "{CAPTURE_LEN_EXCEEDED}"),
Error::InvalidRecordLength => write!(f, "{INVALID_RECORD_LENGTH}"),
Error::InvalidPadLen => write!(f, "{INVALID_PAD_LENGTH}"),
Error::Eof => write!(f, "{EOF}"),
Error::UnexpectedEof(n) => write!(f, "{UNEXEOF}, read {n} bytes"),
Error::Io(ref err) => err.fmt(f),
Error::Time(ref err) => err.fmt(f),
Error::TimeEpoch => write!(f, "{TIME_EPOCH_EXEEDED}"),
}
}
}
impl error::Error for Error {}
impl From<Error> for io::Error {
fn from(size_err: Error) -> io::Error {
io::Error::new(io::ErrorKind::Other, size_err)
}
}
impl From<io::Error> for Error {
fn from(err: io::Error) -> Error {
Error::Io(err)
}
}