prx 0.5.9

Praxis — agent-native Unix tools. Single binary replacing grep, cat, find, sed, diff for AI coding agents.
use super::ParsedResult;

pub fn parse(output: &str, exit_code: i32) -> ParsedResult {
    let tail_lines = if exit_code == 0 { 10 } else { 20 };
    let lines: Vec<&str> = output.lines().collect();
    let start = lines.len().saturating_sub(tail_lines);
    let tail = lines[start..].join("\n");

    ParsedResult {
        summary: format!("exited {exit_code}"),
        passed: 0,
        failed: if exit_code != 0 { 1 } else { 0 },
        skipped: 0,
        failures: vec![],
        warnings: vec![],
        tail: Some(tail),
    }
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn fallback_success() {
        let result = parse("hello\nworld\n", 0);
        assert_eq!(result.summary, "exited 0");
        assert_eq!(result.failed, 0);
        assert!(result.tail.unwrap().contains("hello"));
    }

    #[test]
    fn fallback_failure() {
        let result = parse("error: something broke\n", 1);
        assert_eq!(result.summary, "exited 1");
        assert_eq!(result.failed, 1);
    }

    #[test]
    fn fallback_truncates_long_output() {
        let lines: Vec<String> = (0..100).map(|i| format!("line {i}")).collect();
        let output = lines.join("\n");
        let result = parse(&output, 0);
        let tail = result.tail.unwrap();
        let tail_count = tail.lines().count();
        assert!(tail_count <= 10);
    }

    #[test]
    fn failure_gets_more_tail() {
        let lines: Vec<String> = (0..100).map(|i| format!("line {i}")).collect();
        let output = lines.join("\n");
        let result = parse(&output, 1);
        let tail = result.tail.unwrap();
        let tail_count = tail.lines().count();
        assert!(tail_count <= 20);
        assert!(tail_count > 10);
    }
}