use std::{
error::Error,
fmt::{self, Write},
};
use crate::error::parse::{
knot::{write_knot_error, KnotError},
prelude::PreludeError,
};
impl Error for ParseError {}
#[derive(Debug)]
pub struct ParseError {
pub prelude_errors: Vec<PreludeError>,
pub knot_errors: Vec<KnotError>,
}
pub(crate) fn print_parse_error(error: &ParseError) -> Result<String, fmt::Error> {
let mut buffer = String::new();
for prelude_error in &error.prelude_errors {
write!(&mut buffer, "{}\n", prelude_error)?;
}
for knot_error in &error.knot_errors {
write_knot_error(&mut buffer, knot_error)?;
}
Ok(buffer)
}
impl fmt::Display for ParseError {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
let num_errors = self.prelude_errors.len()
+ self
.knot_errors
.iter()
.map(|error| error.line_errors.len())
.sum::<usize>();
write!(
f,
"Could not parse story: found {} errors in lines.",
num_errors
)
}
}