use std::error::Error;
use std::fmt;
use std::io;
#[derive(Debug)]
pub enum NetworkInterfacesError {
Io(io::Error),
Parser(ParserError),
FamilyParse(FamilyParseError),
MethodParse(MethodParseError),
FileModified,
Other(String),
}
impl fmt::Display for NetworkInterfacesError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
NetworkInterfacesError::Io(err) => write!(f, "I/O error: {}", err),
NetworkInterfacesError::Parser(err) => write!(f, "Parser error: {}", err),
NetworkInterfacesError::FamilyParse(err) => write!(f, "Family parse error: {}", err),
NetworkInterfacesError::MethodParse(err) => write!(f, "Method parse error: {}", err),
NetworkInterfacesError::FileModified => write!(
f,
"The interfaces file has been modified on disk since it was last loaded."
),
NetworkInterfacesError::Other(msg) => write!(f, "Error: {}", msg),
}
}
}
impl Error for NetworkInterfacesError {
fn source(&self) -> Option<&(dyn Error + 'static)> {
match self {
NetworkInterfacesError::Io(err) => Some(err),
NetworkInterfacesError::Parser(err) => Some(err),
NetworkInterfacesError::FamilyParse(err) => Some(err),
NetworkInterfacesError::MethodParse(err) => Some(err),
NetworkInterfacesError::FileModified => None,
NetworkInterfacesError::Other(_) => None,
}
}
}
impl From<io::Error> for NetworkInterfacesError {
fn from(err: io::Error) -> Self {
NetworkInterfacesError::Io(err)
}
}
impl From<ParserError> for NetworkInterfacesError {
fn from(err: ParserError) -> Self {
NetworkInterfacesError::Parser(err)
}
}
impl From<FamilyParseError> for NetworkInterfacesError {
fn from(err: FamilyParseError) -> Self {
NetworkInterfacesError::FamilyParse(err)
}
}
impl From<MethodParseError> for NetworkInterfacesError {
fn from(err: MethodParseError) -> Self {
NetworkInterfacesError::MethodParse(err)
}
}
#[derive(Debug, Clone)]
pub struct ParserError {
pub message: String,
pub line: Option<usize>,
}
impl fmt::Display for ParserError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
if let Some(line) = self.line {
write!(f, "Parser error on line {}: {}", line, self.message)
} else {
write!(f, "Parser error: {}", self.message)
}
}
}
impl Error for ParserError {}
#[derive(Debug, Clone)]
pub struct FamilyParseError(pub String);
impl fmt::Display for FamilyParseError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "Invalid family: {}", self.0)
}
}
impl Error for FamilyParseError {}
#[derive(Debug, Clone)]
pub struct MethodParseError(pub String);
impl fmt::Display for MethodParseError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "Invalid method: {}", self.0)
}
}
impl Error for MethodParseError {}