use aion_client::ClientError;
#[derive(Debug, thiserror::Error)]
pub enum WorkflowConnectError {
#[error("workflow runtime unavailable: {message}")]
Runtime {
message: String,
},
#[error("workflow endpoint refused: {message}")]
Endpoint {
message: String,
},
}
#[derive(Debug, thiserror::Error)]
pub enum WorkflowCallError {
#[error("workflow unknown: {message}")]
Unknown {
message: String,
},
#[error("idempotency key conflict: {message}")]
IdempotencyConflict {
message: String,
},
#[error("workflow not live: {message}")]
NotLive {
message: String,
},
#[error("workflow state refuses this operation: {message}")]
InvalidState {
message: String,
},
#[error("invalid workflow request: {message}")]
InvalidArgument {
message: String,
},
#[error("workflow access denied: {message}")]
AccessDenied {
message: String,
},
#[error("workflow call cancelled: {message}")]
Cancelled {
message: String,
},
#[error("workflow connection lost: {message}")]
ConnectionLost {
message: String,
},
#[error("workflow substrate error: {message}")]
Substrate {
message: String,
},
}
impl WorkflowCallError {
pub(crate) fn from_client(error: &ClientError) -> Self {
let message = error.to_string();
match error {
ClientError::NotFound { .. } => Self::Unknown { message },
ClientError::AlreadyExists { .. } => Self::IdempotencyConflict { message },
ClientError::NotRunning { .. } => Self::NotLive { message },
ClientError::InvalidState { .. } => Self::InvalidState { message },
ClientError::InvalidArgument { .. } => Self::InvalidArgument { message },
ClientError::Unauthenticated { .. } | ClientError::NamespaceDenied { .. } => {
Self::AccessDenied { message }
}
ClientError::Cancelled { .. } => Self::Cancelled { message },
ClientError::Unavailable { .. } => Self::ConnectionLost { message },
_ => Self::Substrate { message },
}
}
}
#[derive(Debug, thiserror::Error)]
pub enum WorkflowObserveError {
#[error("workflow observation connection lost: {message}")]
ConnectionLost {
message: String,
},
#[error("workflow event stream ended without a terminal")]
StreamEnded,
#[error("workflow observation substrate error: {message}")]
Substrate {
message: String,
},
}
impl WorkflowObserveError {
pub(crate) fn from_client(error: &ClientError) -> Self {
let message = error.to_string();
match error {
ClientError::Unavailable { .. } => Self::ConnectionLost { message },
_ => Self::Substrate { message },
}
}
}