use aion_core::RunId;
use super::Recorder;
use crate::durability::DurabilityError;
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum RunAdmission {
Open,
RefusedTerminal,
}
impl Recorder {
pub async fn admit_run_append(&self, run_id: &RunId) -> Result<RunAdmission, DurabilityError> {
if let Some(current) = &self.run_id {
return Ok(if current == run_id {
RunAdmission::Open
} else {
RunAdmission::RefusedTerminal
});
}
let history = self.store.read_history(&self.workflow_id).await?;
Ok(run_generation_admission(&history, run_id))
}
}
fn run_generation_admission(history: &[aion_core::Event], run_id: &RunId) -> RunAdmission {
match crate::lifecycle::visibility::run_window(history, run_id) {
Some(window) if window.len() == history.len() => RunAdmission::Open,
_ => RunAdmission::RefusedTerminal,
}
}
#[cfg(test)]
#[path = "run_guard_tests.rs"]
mod tests;