#[derive(Debug, derive_more::From, derive_more::Display, derive_more::Error)]
#[from(AddressErrorKind)]
pub struct AddressError {
kind: Box<AddressErrorKind>,
}
macro_rules! impl_address_error {
( $( $name:ident),* ) => {
$(
impl From<$name> for AddressError {
fn from(value: $name) -> Self {
let kind = Box::new(AddressErrorKind::from(value));
Self { kind }
}
}
)*
};
( $( $name:ident),+ ,) => {
impl_address_err![ $( $name ),* ];
};
}
impl_address_error!(Decode, Encode, Io, Nom);
#[derive(Debug, derive_more::From, derive_more::Display, derive_more::Error)]
pub enum AddressErrorKind {
#[from(Decode)]
Decode(Decode),
#[from(Encode)]
Encode(Encode),
#[from(Builder)]
Builder,
#[from(Csv)]
Csv(Csv),
#[from(Io)]
Io(Io),
#[from(Nom)]
Nom(Nom),
}
#[derive(Debug, derive_more::Display, derive_more::Error, derive_new::new)]
#[display("io error at path {path:?} in line {line} of {file}")]
pub struct Io {
path: std::path::PathBuf,
source: std::io::Error,
line: u32,
file: String,
}
#[derive(Debug, derive_more::Display, derive_more::Error, derive_new::new)]
#[display("csv error at path {path:?} in line {line} of {file}")]
pub struct Csv {
path: std::path::PathBuf,
source: csv::Error,
line: u32,
file: String,
}
#[derive(Debug, derive_more::Display, derive_more::Error, derive_new::new)]
#[display("bincode decode error: {source:?} at line {line} in {file}")]
pub struct Decode {
source: bincode::error::DecodeError,
line: u32,
file: String,
}
#[derive(Debug, derive_more::Display, derive_more::Error, derive_new::new)]
#[display("bincode encode error: {source:?} at line {line} in {file}")]
pub struct Encode {
source: bincode::error::EncodeError,
line: u32,
file: String,
}
#[derive(Debug, derive_more::Display, derive_new::new)]
#[display("Error constructing {target}: {issue} in line {line} of {file}")]
pub struct Builder {
issue: String,
target: String,
line: u32,
file: String,
}
impl std::error::Error for Builder {
fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
None
}
}
#[derive(Debug, derive_more::Display, derive_more::Error)]
#[display("nom parsing error: {description} in line {line} of {file}")]
pub struct Nom {
description: String,
source: nom::Err<nom::error::Error<String>>,
line: u32,
file: String,
}
impl Nom {
pub fn new(
description: String,
source: nom::Err<nom::error::Error<&str>>,
line: u32,
file: String,
) -> Self {
let source = source.to_owned();
Self {
description,
source,
line,
file,
}
}
}