use crate::agent_result::AgentStatus;
use crate::stage::Stage;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Action {
Advance,
AutoResume,
GateInfra,
GateReview,
}
pub fn decide_action(_stage: Stage, outcome: AgentStatus) -> Action {
match outcome {
AgentStatus::Success => Action::Advance,
AgentStatus::RateLimited => Action::AutoResume,
AgentStatus::ResourceKilled => Action::GateInfra,
AgentStatus::AgentUnavailable => Action::GateInfra,
AgentStatus::Failed => Action::GateReview,
AgentStatus::Unknown => Action::GateReview,
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn success_advances() {
assert_eq!(
decide_action(Stage::Code, AgentStatus::Success),
Action::Advance
);
}
#[test]
fn rate_limited_auto_resumes() {
assert_eq!(
decide_action(Stage::Code, AgentStatus::RateLimited),
Action::AutoResume
);
}
#[test]
fn resource_killed_gates_infra() {
assert_eq!(
decide_action(Stage::Code, AgentStatus::ResourceKilled),
Action::GateInfra
);
}
#[test]
fn agent_unavailable_gates_infra() {
assert_eq!(
decide_action(Stage::Code, AgentStatus::AgentUnavailable),
Action::GateInfra
);
}
#[test]
fn failed_gates_review() {
assert_eq!(
decide_action(Stage::Code, AgentStatus::Failed),
Action::GateReview
);
}
#[test]
fn unknown_gates_review_never_advances() {
assert_eq!(
decide_action(Stage::Code, AgentStatus::Unknown),
Action::GateReview
);
assert_ne!(
decide_action(Stage::Code, AgentStatus::Unknown),
Action::Advance
);
}
#[test]
fn decide_action_is_deterministic() {
for stage in [
Stage::Define,
Stage::Plan,
Stage::Code,
Stage::Validate,
Stage::Ship,
] {
for outcome in [
AgentStatus::Success,
AgentStatus::Failed,
AgentStatus::RateLimited,
AgentStatus::Unknown,
AgentStatus::ResourceKilled,
AgentStatus::AgentUnavailable,
] {
assert_eq!(decide_action(stage, outcome), decide_action(stage, outcome));
}
}
}
}