use std::time::Duration;
use thiserror::Error;
use crate::id::{ConversationSeq, CorrelationId};
pub mod slug {
pub const CONV_ENVELOPE_MALFORMED: &str = "CONV_ENVELOPE_MALFORMED";
pub const CONV_PATTERN_UNKNOWN: &str = "CONV_PATTERN_UNKNOWN";
pub const CONV_KIND_INVALID: &str = "CONV_KIND_INVALID";
pub const CONV_CORRELATION_INVALID: &str = "CONV_CORRELATION_INVALID";
pub const CONV_SCHEMA_INVALID: &str = "CONV_SCHEMA_INVALID";
}
#[derive(Debug, Clone, Error)]
#[error("{slug}: {detail}")]
pub struct EnvelopeError {
pub slug: &'static str,
pub detail: String,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum RefusalClass {
Capacity,
Authority,
Identity,
Order,
Protocol,
}
#[derive(Debug, Error)]
pub enum AttachError {
#[error("bus endpoint failed: {detail}")]
Endpoint {
detail: String,
},
#[error("attach refused ({class:?}): {detail}")]
Refused {
class: RefusalClass,
detail: String,
},
#[error("attach lost the connection: {detail}")]
ConnectionLost {
detail: String,
},
#[error("attach answer window elapsed after {waited:?}")]
AnswerTimeout {
waited: Duration,
},
#[error("resume state rejected: {detail}")]
ResumeRejected {
detail: String,
},
#[error("resume store failed: {detail}")]
Store {
detail: String,
},
#[error("attach protocol violation: {detail}")]
Protocol {
detail: String,
},
}
#[derive(Debug, Error)]
pub enum PublishError {
#[error("{}: {detail}", slug::CONV_SCHEMA_INVALID)]
SchemaInvalid {
detail: String,
},
#[error("publish refused ({class:?}): {detail}")]
Refused {
class: RefusalClass,
detail: String,
},
#[error("publish lost the connection: {detail}")]
ConnectionLost {
detail: String,
},
#[error("publish answer window elapsed after {waited:?}")]
AnswerTimeout {
waited: Duration,
},
#[error("publish protocol violation: {detail}")]
Protocol {
detail: String,
},
}
#[derive(Debug, Error)]
pub enum LeaveError {
#[error("leave refused ({class:?}): {detail}")]
Refused {
class: RefusalClass,
detail: String,
},
#[error("leave lost the connection: {detail}")]
ConnectionLost {
detail: String,
},
#[error("leave answer window elapsed after {waited:?}")]
AnswerTimeout {
waited: Duration,
},
#[error("bus endpoint failed: {detail}")]
Endpoint {
detail: String,
},
#[error("resume state rejected: {detail}")]
ResumeRejected {
detail: String,
},
#[error("resume store failed: {detail}")]
Store {
detail: String,
},
#[error("leave protocol violation: {detail}")]
Protocol {
detail: String,
},
}
#[derive(Debug, Error)]
pub enum CallError {
#[error(transparent)]
Publish(#[from] PublishError),
#[error("connection lost while waiting: {detail}")]
ConnectionLost {
detail: String,
},
#[error(
"{}: reply to {correlation} invalid: {detail}",
slug::CONV_SCHEMA_INVALID
)]
ReplySchemaInvalid {
correlation: CorrelationId,
detail: String,
},
#[error("call protocol violation: {detail}")]
Protocol {
detail: String,
},
}
#[derive(Debug, Clone, Error)]
#[error("resume store failure: {detail}")]
pub struct StoreError {
pub detail: String,
}
impl StoreError {
#[must_use]
pub fn new(detail: impl Into<String>) -> Self {
Self {
detail: detail.into(),
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum CursorCommit {
Committed {
through: ConversationSeq,
},
NoOp {
current: ConversationSeq,
},
Gap {
requested: ConversationSeq,
current: ConversationSeq,
},
Regression {
requested: ConversationSeq,
},
}