use std::fmt;
use lenso_kernel::{RuntimeFailure, ShutdownOutcome};
#[derive(Clone, Debug, Eq, PartialEq)]
pub enum ReplicatedRunnerError {
InvalidPlan { detail: String },
LaneStartup { lane: String, detail: String },
MissingCrossLaneRequestTransfer { capability: String },
MissingCrossLaneStreamTransfer { capability: String },
MissingCrossLaneEventTransfer { capability: String },
LaneUnavailable { lane: String },
LanePanicked { lane: String },
LaneRuntimeFailure { lane: String, error: RuntimeFailure },
LaneShutdown {
lane: String,
outcome: ShutdownOutcome,
},
}
impl fmt::Display for ReplicatedRunnerError {
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::InvalidPlan { detail } => {
write!(formatter, "invalid Resolved App Plan: {detail}")
}
Self::LaneStartup { lane, detail } => {
write!(
formatter,
"Execution Lane `{lane}` failed to start: {detail}"
)
}
Self::MissingCrossLaneRequestTransfer { capability } => write!(
formatter,
"Capability `{capability}` has no registered native cross-lane request transfer"
),
Self::MissingCrossLaneStreamTransfer { capability } => write!(
formatter,
"Capability `{capability}` has no registered native cross-lane stream transfer"
),
Self::MissingCrossLaneEventTransfer { capability } => write!(
formatter,
"Capability `{capability}` has no registered native cross-lane Event transfer"
),
Self::LaneUnavailable { lane } => {
write!(formatter, "Execution Lane `{lane}` is unavailable")
}
Self::LanePanicked { lane } => write!(formatter, "Execution Lane `{lane}` panicked"),
Self::LaneRuntimeFailure { lane, error } => write!(
formatter,
"Execution Lane `{lane}` reached a terminal runtime failure: {error:?}"
),
Self::LaneShutdown { lane, outcome } => write!(
formatter,
"Execution Lane `{lane}` stopped with {outcome:?}"
),
}
}
}
impl std::error::Error for ReplicatedRunnerError {}