use crate::error::{StepError, StepFailure};
use crate::result::{CellFailure, ExampleFailure};
pub fn to_failure(failure: &StepFailure, spec_path: &str, fallback_line: i64) -> ExampleFailure {
let message = failure.error.message();
let cells = match &failure.error {
StepError::CellMismatch(cells) => {
let failing: Vec<CellFailure> = cells
.iter()
.filter(|c| !c.ok)
.map(|c| CellFailure::new(c.span.start_offset, c.span.end_offset, c.actual.clone()))
.collect();
(!failing.is_empty()).then_some(failing)
}
_ => None,
};
let doc = match &failure.error {
StepError::DocStringMismatch(diff) => Some(CellFailure::new(
diff.span.start_offset,
diff.span.end_offset,
diff.actual.clone(),
)),
_ => None,
};
let line = failure
.location
.as_ref()
.filter(|l| l.path == spec_path)
.map_or(fallback_line, |l| l.line as i64);
let stack = render_stack(failure);
ExampleFailure {
line,
message,
stack,
cells,
doc,
}
}
fn render_stack(failure: &StepFailure) -> String {
match &failure.location {
Some(l) => {
format!("{}\n at {} ({}:{})", failure.error.message(), l.label, l.path, l.line)
}
None => failure.error.message(),
}
}