use crate::error::{metadata::ProvideErrorMetadata, ErrorMetadata};
use std::error::Error as StdError;
#[derive(Default, Debug)]
pub struct Builder {
source: Option<Box<dyn StdError + Send + Sync + 'static>>,
meta: Option<ErrorMetadata>,
}
impl Builder {
pub fn source(mut self, source: impl Into<Box<dyn StdError + Send + Sync + 'static>>) -> Self {
self.source = Some(source.into());
self
}
pub fn set_source(
&mut self,
source: Option<Box<dyn StdError + Send + Sync + 'static>>,
) -> &mut Self {
self.source = source;
self
}
pub fn meta(mut self, meta: ErrorMetadata) -> Self {
self.meta = Some(meta);
self
}
pub fn set_meta(&mut self, meta: Option<ErrorMetadata>) -> &mut Self {
self.meta = meta;
self
}
pub fn build(self) -> Unhandled {
Unhandled {
source: self.source.expect("unhandled errors must have a source"),
meta: self.meta.unwrap_or_default(),
}
}
}
#[derive(Debug)]
pub struct Unhandled {
source: Box<dyn StdError + Send + Sync + 'static>,
meta: ErrorMetadata,
}
impl Unhandled {
pub fn builder() -> Builder {
Default::default()
}
}
impl std::fmt::Display for Unhandled {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> Result<(), std::fmt::Error> {
write!(f, "unhandled error")
}
}
impl StdError for Unhandled {
fn source(&self) -> Option<&(dyn StdError + 'static)> {
Some(self.source.as_ref() as _)
}
}
impl ProvideErrorMetadata for Unhandled {
fn meta(&self) -> &ErrorMetadata {
&self.meta
}
}