use std::{
error::Error,
fmt,
};
use crate::{
Event,
error::ReporterError,
};
#[derive(Clone, Debug)]
pub struct DeliveryError {
event: Box<Event>,
source: ReporterError,
}
impl DeliveryError {
pub(crate) fn new(event: Event, source: ReporterError) -> Self {
Self {
event: Box::new(event),
source,
}
}
#[must_use]
pub const fn event(&self) -> &Event {
&self.event
}
#[must_use]
pub const fn reporter_error(&self) -> &ReporterError {
&self.source
}
#[must_use]
pub fn into_event(self) -> Event {
*self.event
}
#[must_use]
pub fn into_reporter_error(self) -> ReporterError {
self.source
}
#[must_use]
pub fn into_parts(self) -> (Event, ReporterError) {
(*self.event, self.source)
}
}
impl fmt::Display for DeliveryError {
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(
formatter,
"delivery of {} event for operation {} sequence {} failed: {}",
self.event.phase().as_str(),
self.event.operation_id(),
self.event.sequence(),
self.source,
)
}
}
impl Error for DeliveryError {
fn source(&self) -> Option<&(dyn Error + 'static)> {
Some(&self.source)
}
}