use crate::traits::{Handled, HandlerError};
use crate::CanonicalMessage;
pub trait IntoHandled {
fn into_handled(self) -> Handled;
}
impl IntoHandled for Handled {
fn into_handled(self) -> Handled {
self
}
}
impl IntoHandled for () {
fn into_handled(self) -> Handled {
Handled::Ack
}
}
impl IntoHandled for CanonicalMessage {
fn into_handled(self) -> Handled {
Handled::Publish(self)
}
}
impl IntoHandled for Option<CanonicalMessage> {
fn into_handled(self) -> Handled {
match self {
Some(msg) => Handled::Publish(msg),
None => Handled::Ack,
}
}
}
pub trait IntoHandlerResult: Send + Sync + 'static {
fn into_handler_result(self) -> Result<Handled, HandlerError>;
}
pub trait ErgonomicResponse: IntoHandlerResult {}
impl IntoHandlerResult for Handled {
fn into_handler_result(self) -> Result<Handled, HandlerError> {
Ok(self)
}
}
impl ErgonomicResponse for Handled {}
impl IntoHandlerResult for () {
fn into_handler_result(self) -> Result<Handled, HandlerError> {
Ok(Handled::Ack)
}
}
impl ErgonomicResponse for () {}
impl IntoHandlerResult for CanonicalMessage {
fn into_handler_result(self) -> Result<Handled, HandlerError> {
Ok(Handled::Publish(self))
}
}
impl ErgonomicResponse for CanonicalMessage {}
impl IntoHandlerResult for Option<CanonicalMessage> {
fn into_handler_result(self) -> Result<Handled, HandlerError> {
Ok(self.into_handled())
}
}
impl ErgonomicResponse for Option<CanonicalMessage> {}
impl IntoHandlerResult for Result<Handled, HandlerError> {
fn into_handler_result(self) -> Result<Handled, HandlerError> {
self
}
}
impl<E> IntoHandlerResult for Result<(), E>
where
E: ToHandlerError + Send + Sync + 'static,
{
fn into_handler_result(self) -> Result<Handled, HandlerError> {
match self {
Ok(_) => Ok(Handled::Ack),
Err(err) => Err(err.to_handler_error()),
}
}
}
impl<E> ErgonomicResponse for Result<(), E> where E: ToHandlerError + Send + Sync + 'static {}
impl<E> IntoHandlerResult for Result<CanonicalMessage, E>
where
E: ToHandlerError + Send + Sync + 'static,
{
fn into_handler_result(self) -> Result<Handled, HandlerError> {
match self {
Ok(msg) => Ok(Handled::Publish(msg)),
Err(err) => Err(err.to_handler_error()),
}
}
}
impl<E> ErgonomicResponse for Result<CanonicalMessage, E> where
E: ToHandlerError + Send + Sync + 'static
{
}
impl<E> IntoHandlerResult for Result<Option<CanonicalMessage>, E>
where
E: ToHandlerError + Send + Sync + 'static,
{
fn into_handler_result(self) -> Result<Handled, HandlerError> {
match self {
Ok(val) => Ok(val.into_handled()),
Err(err) => Err(err.to_handler_error()),
}
}
}
impl<E> ErgonomicResponse for Result<Option<CanonicalMessage>, E> where
E: ToHandlerError + Send + Sync + 'static
{
}
pub trait ToHandlerError {
fn to_handler_error(self) -> HandlerError;
}
impl ToHandlerError for HandlerError {
fn to_handler_error(self) -> HandlerError {
self
}
}
impl ToHandlerError for anyhow::Error {
fn to_handler_error(self) -> HandlerError {
crate::errors::ProcessingError::Retryable(self)
}
}
impl ToHandlerError for String {
fn to_handler_error(self) -> HandlerError {
crate::errors::ProcessingError::NonRetryable(anyhow::anyhow!(self))
}
}
impl ToHandlerError for &str {
fn to_handler_error(self) -> HandlerError {
crate::errors::ProcessingError::NonRetryable(anyhow::anyhow!(self.to_string()))
}
}
#[cfg(test)]
mod tests {
}