use std::{fmt::Display, sync::Arc};
use crate::{EventMessage, HandlerError, SubscriptionInfo};
#[derive(Debug)]
pub enum DeadLetterReason {
HandlerFailed(HandlerError),
InboxFull,
}
impl Display for DeadLetterReason {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::HandlerFailed(error) => Display::fmt(error, f),
Self::InboxFull => write!(f, "subscription inbox is full"),
}
}
}
#[derive(Debug)]
pub struct DeadLetter {
pub(crate) message: Arc<EventMessage>,
pub(crate) subscription: Arc<SubscriptionInfo>,
pub(crate) reason: DeadLetterReason,
pub(crate) attempts: u32,
}
impl DeadLetter {
pub fn message(&self) -> &Arc<EventMessage> {
&self.message
}
pub fn subscription(&self) -> &SubscriptionInfo {
&self.subscription
}
pub fn reason(&self) -> &DeadLetterReason {
&self.reason
}
pub fn attempts(&self) -> u32 {
self.attempts
}
}
#[async_trait::async_trait]
pub trait DeadLetterSink: std::fmt::Debug + Send + Sync {
async fn dead_letter(&self, letter: DeadLetter) -> anyhow::Result<()>;
}