Skip to main content

apm_core/wrapper/builtin/
mock_sad.rs

1use 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}