use crate::result::{EngineOutput, EngineOutputWithSnapshot};
use crate::state::{State, UserState};
use crate::TrellisFloat;
pub type EngineResult<O, S, E> = Result<EngineOutput<O, S>, EngineFailure<S, E>>;
pub(super) type InternalEngineResult<O, S, E> =
Result<EngineOutput<O, S>, InternalEngineFailure<E>>;
pub type EngineResultWithSnapshot<O, S, E> =
Result<EngineOutputWithSnapshot<O, S>, EngineFailure<S, E>>;
#[derive(thiserror::Error, Debug)]
pub enum EngineFailure<S, E>
where
S: UserState,
<S as UserState>::Float: TrellisFloat,
{
#[error("error in underlying procedure: {error}")]
Procedure {
error: E,
state: State<S>,
},
}
impl<S, E> EngineFailure<S, E>
where
S: UserState,
<S as UserState>::Float: TrellisFloat,
{
pub(super) fn from_internal(internal: InternalEngineFailure<E>, state: State<S>) -> Self {
EngineFailure::Procedure {
error: internal.0,
state,
}
}
}
pub(super) struct InternalEngineFailure<E>(E);
impl<E> InternalEngineFailure<E> {
pub(super) fn new(error: E) -> Self {
Self(error)
}
}