apm_core/wrapper/builtin/
mock_sad.rs1use crate::config::resolve_outcome;
2use super::{load_transitions_with_outcomes, sad_script, seed_from_ctx, write_and_spawn_script};
3use crate::wrapper::{Wrapper, WrapperContext};
4
5pub struct MockSadWrapper;
6
7impl Wrapper for MockSadWrapper {
8 fn spawn(&self, ctx: &WrapperContext) -> anyhow::Result<std::process::Child> {
9 let transitions = load_transitions_with_outcomes(ctx)?;
10 let eligible: Vec<_> = transitions.iter()
11 .filter(|(t, s)| resolve_outcome(t, s) != "success")
12 .collect();
13 if eligible.is_empty() {
14 anyhow::bail!(
15 "mock-sad: no non-success transitions from state '{}'",
16 ctx.current_state
17 );
18 }
19 let seed = seed_from_ctx(ctx);
20 let idx = (seed as usize) % eligible.len();
21 let target = eligible[idx].0.to.clone();
22 let script = sad_script(&ctx.ticket_id, &target);
23 write_and_spawn_script("sad", &script, ctx)
24 }
25}