use thiserror::Error;
use tokio::sync::broadcast::error::{RecvError,TryRecvError};
#[derive(Debug, Error, Clone)]
pub enum EventReceiveError {
#[error("Event bus has been dropped - all senders closed")]
BusDropped,
#[error("Receiver lagged behind by {skipped} events - some events were missed")]
Lagged { skipped: u64 },
}
#[derive(Debug, Error, Clone)]
pub enum EventTryReceiveError {
#[error("No events available in the channel")]
Empty,
#[error("Event bus has been dropped - all senders closed")]
BusDropped,
#[error("Receiver lagged behind by {skipped} events - some events were missed")]
Lagged { skipped: u64 },
}
#[derive(Debug, Error)]
pub enum EventSendError {
#[error("No active receivers - event was not sent")]
NoReceivers,
}
impl From<RecvError> for EventReceiveError {
fn from(err: RecvError) -> Self {
match err {
RecvError::Closed => EventReceiveError::BusDropped,
RecvError::Lagged(skipped) => {
EventReceiveError::Lagged { skipped }
}
}
}
}
impl From<TryRecvError> for EventTryReceiveError {
fn from(err: TryRecvError) -> Self {
match err {
TryRecvError::Empty => EventTryReceiveError::Empty,
TryRecvError::Closed => {
EventTryReceiveError::BusDropped
}
TryRecvError::Lagged(skipped) => {
EventTryReceiveError::Lagged { skipped }
}
}
}
}
pub type EventReceiveResult<T> = Result<T, EventReceiveError>;
pub type EventTryReceiveResult<T> = Result<T, EventTryReceiveError>;
pub type EventSendResult<T> = Result<T, EventSendError>;