use serde::Deserialize;
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct TestResult {
pub name: String,
pub outcome: TestOutcome,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum TestOutcome {
Passed,
Failed,
Ignored,
}
#[derive(Deserialize)]
struct TestEvent {
#[serde(rename = "type")]
kind: String,
event: String,
name: Option<String>,
}
pub fn parse_nextest_output(output: &str) -> Vec<TestResult> {
let mut results = Vec::new();
for line in output.lines() {
let Ok(event) = serde_json::from_str::<TestEvent>(line) else {
continue;
};
if event.kind != "test" {
continue;
}
let outcome = match event.event.as_str() {
"ok" => TestOutcome::Passed,
"failed" => TestOutcome::Failed,
"ignored" => TestOutcome::Ignored,
_ => continue, };
let Some(full_name) = event.name else {
continue;
};
results.push(TestResult {
name: full_name,
outcome,
});
}
results
}