use super::workflow::WorkflowResult;
use super::SourceChainError;
use super::SysValidationError;
use super::ValidationOutcome;
use holochain_state::prelude::IncompleteCommitReason;
use std::convert::TryFrom;
#[derive(Debug)]
pub enum OutcomeOrError<T, E> {
Outcome(T),
Err(E),
}
impl<T, E> OutcomeOrError<T, E> {
pub fn into_outcome(self) -> Option<T> {
if let Self::Outcome(t) = self {
Some(t)
} else {
None
}
}
pub fn into_err(self) -> Option<E> {
if let Self::Err(e) = self {
Some(e)
} else {
None
}
}
}
#[macro_export]
macro_rules! from_sub_error {
($error_type:ident, $sub_error_type:ident) => {
impl<T> From<$sub_error_type> for OutcomeOrError<T, $error_type> {
fn from(e: $sub_error_type) -> Self {
OutcomeOrError::Err($error_type::from(e))
}
}
};
}
impl OutcomeOrError<ValidationOutcome, SysValidationError> {
pub fn into_workflow_error<T>(self) -> WorkflowResult<T> {
let outcome = ValidationOutcome::try_from(self)?;
match outcome {
ValidationOutcome::DepMissingFromDht(deps) => Err(SourceChainError::IncompleteCommit(
IncompleteCommitReason::DepMissingFromDht(vec![deps]),
)
.into()),
outcome => Err(SourceChainError::InvalidCommit(outcome.to_string()).into()),
}
}
}