yarp-cli 0.1.0

Prune Pi command output and archive tool calls locally
Documentation
use super::classify::{body, contains_ascii_insensitive, has_diagnostic_word};
use super::evidence::EvidenceClass;

#[must_use]
pub fn classify(line: &[u8]) -> EvidenceClass {
    let line = body(line);
    if line.is_empty() {
        EvidenceClass::Noise
    } else if is_search_diagnostic(line) {
        EvidenceClass::Diagnostic
    } else {
        EvidenceClass::Example
    }
}

fn is_search_diagnostic(line: &[u8]) -> bool {
    let command_prefix = [
        &b"rg:"[..],
        &b"grep:"[..],
        &b"egrep:"[..],
        &b"fgrep:"[..],
        &b"git grep:"[..],
    ]
    .iter()
    .any(|prefix| line.starts_with(prefix));
    (command_prefix || line.starts_with(b"error:"))
        && (has_diagnostic_word(line)
            || [
                &b"cannot"[..],
                &b"could not"[..],
                &b"denied"[..],
                &b"invalid"[..],
                &b"no such"[..],
                &b"unknown"[..],
                &b"unrecognized"[..],
            ]
            .iter()
            .any(|term| contains_ascii_insensitive(line, term)))
}

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

    #[test]
    fn keeps_search_failures_without_misclassifying_matches() {
        assert_eq!(
            classify(b"rg: private: Permission denied\n"),
            EvidenceClass::Diagnostic
        );
        assert_eq!(
            classify(b"grep: missing: No such file or directory\n"),
            EvidenceClass::Diagnostic
        );
        assert_eq!(
            classify(b"src/lib.rs:4:grep: useful match\n"),
            EvidenceClass::Example
        );
    }
}