use crate::{
data_converters::{TemporalDeserializable, TemporalSerializable},
error::{ApplicationFailure, FailurePayloads},
};
pub trait ActivityDefinition {
type Input: TemporalDeserializable + TemporalSerializable + 'static;
type Output: TemporalDeserializable + TemporalSerializable + 'static;
fn name() -> &'static str
where
Self: Sized;
}
#[derive(Debug)]
pub enum ActivityError {
Application(Box<ApplicationFailure>),
Cancelled {
details: Option<FailurePayloads>,
},
WillCompleteAsync,
}
impl ActivityError {
pub fn cancelled() -> Self {
Self::Cancelled { details: None }
}
pub fn cancelled_with_details<T>(details: T) -> Self
where
T: Into<FailurePayloads>,
{
Self::Cancelled {
details: Some(details.into()),
}
}
pub fn application(err: ApplicationFailure) -> Self {
Self::Application(err.into())
}
}
impl<E> From<E> for ActivityError
where
E: Into<anyhow::Error>,
{
fn from(source: E) -> Self {
match source.into().downcast::<ApplicationFailure>() {
Ok(application_failure) => Self::Application(Box::new(application_failure)),
Err(err) => Self::Application(ApplicationFailure::new(err).into()),
}
}
}