#[derive(Debug, thiserror::Error)]
#[non_exhaustive]
pub enum Error {
#[error("payload exceeds the engine's notification payload limit (limit: {limit} bytes)")]
PayloadTooLarge {
limit: usize,
},
#[error(
"reserved name `{}`: names carrying the reserved `__alkstore_` prefix are engine-owned",
display_safe(.name)
)]
ReservedName {
name: String,
},
#[error("invalid name `{}`", display_safe(.name))]
InvalidName {
name: String,
},
#[error("invalid schedule spec `{}`", display_safe(.spec))]
InvalidSpec {
spec: String,
},
#[error("scheduler leadership lost")]
LeadershipLost,
#[error("the receiver or source is closed")]
Closed,
#[error("payload codec failure: {}", display_safe(.0))]
Codec(String),
#[error("database error")]
Database(#[source] Box<dyn std::error::Error + Send + Sync>),
}
fn display_safe(s: &str) -> String {
s.chars().flat_map(char::escape_debug).collect()
}
impl Error {
pub fn database<E>(err: E) -> Self
where
E: Into<Box<dyn std::error::Error + Send + Sync>>,
{
Error::Database(err.into())
}
}
pub type Result<T> = std::result::Result<T, Error>;