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