safe-chains 0.231.0

Auto-allow safe bash commands in agentic coding tools
Documentation
use super::proptests::arb_script;
use super::*;
use proptest::prelude::*;

fn redirect_count(cmd: &Cmd) -> usize {
    match cmd {
        Cmd::Simple(s) => s.redirs.len(),
        Cmd::Subshell { redirs, .. }
        | Cmd::BraceGroup { redirs, .. }
        | Cmd::For { redirs, .. }
        | Cmd::While { redirs, .. }
        | Cmd::Until { redirs, .. }
        | Cmd::If { redirs, .. }
        | Cmd::DoubleBracket { redirs, .. }
        | Cmd::Case { redirs, .. } => redirs.len(),
        Cmd::FunctionDef { .. } => 0,
    }
}

fn redirect_counts(script: &Script) -> Vec<usize> {
    script.0.iter().flat_map(|s| s.pipeline.commands.iter().map(redirect_count)).collect()
}

proptest! {
    #[test]
    fn normalizing_keeps_every_redirect(script in arb_script(2)) {
        prop_assert_eq!(redirect_counts(&script.normalize()), redirect_counts(&script), "{}", script);
    }
}