pub struct SerdeErrorExtractor<'a> {
error_msg: &'a str,
}
impl<'a> SerdeErrorExtractor<'a> {
pub fn new(error_msg: &'a str) -> Self {
Self { error_msg }
}
pub fn extract_location(&self) -> (usize, usize) {
let mut line = 0;
let mut column = 0;
if let Some(line_pos) = self.error_msg.find("line") {
let after_line = &self.error_msg[line_pos + 4..];
let after_whitespace = after_line.trim_start();
let num_end = after_whitespace
.char_indices()
.find(|(_, c)| !c.is_ascii_digit())
.map(|(i, _)| i)
.unwrap_or(after_whitespace.len());
if let Ok(parsed_line) = after_whitespace[..num_end].parse::<usize>() {
line = parsed_line;
}
}
if let Some(col_pos) = self.error_msg.find("column") {
let after_column = &self.error_msg[col_pos + 6..];
let after_whitespace = after_column.trim_start();
let num_end = after_whitespace
.char_indices()
.find(|(_, c)| !c.is_ascii_digit())
.map(|(i, _)| i)
.unwrap_or(after_whitespace.len());
if let Ok(parsed_column) = after_whitespace[..num_end].parse::<usize>() {
column = parsed_column;
}
}
(line, column)
}
}