#[derive(Debug, PartialEq, Eq)]
pub(crate) enum Outcome {
Answered(Option<String>),
Cancelled,
Failed,
}
pub(crate) fn classify(exit_code: Option<i32>, stdout: &str) -> Outcome {
match exit_code {
Some(0) => {
let text = stdout.trim_end_matches(['\r', '\n']);
if text.trim().is_empty() {
Outcome::Answered(None)
} else {
Outcome::Answered(Some(text.to_string()))
}
}
Some(1) if stdout.trim().is_empty() => Outcome::Cancelled,
_ => Outcome::Failed,
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn classifier_reads_success_cancel_and_failure() {
assert_eq!(
classify(Some(0), "12.50\n"),
Outcome::Answered(Some("12.50".to_string()))
);
assert_eq!(classify(Some(0), ""), Outcome::Answered(None));
assert_eq!(classify(Some(1), ""), Outcome::Cancelled);
assert_eq!(classify(Some(1), "still text"), Outcome::Failed);
assert_eq!(classify(Some(2), ""), Outcome::Failed);
assert_eq!(classify(None, ""), Outcome::Failed);
}
}