#[derive(PartialEq, Debug)]
pub enum ErrorCode {
UnterminatedNormalString,
UnterminatedExtendedString,
UnterminatedMultiLineComment,
UnexpectedClosingDelimiter,
DelimiterMismatch,
PotentialErroneousClosingDelimiterFollowedByComment,
UnclosedDelimiter,
}
#[derive(Debug)]
pub struct ParsingError {
pub error_code: ErrorCode,
pub error_message: String,
}
impl ParsingError {
#[inline]
pub fn new(
code: &[u8],
start_index: usize,
end_index: usize,
error_code: ErrorCode,
error_message: &str,
) -> ParsingError {
#![allow(unused_variables, unused_assignments)]
let code = String::from_utf8_lossy(code);
let error_message = String::from(error_message);
let si = start_index;
let mut sl = 0;
let mut sc = 0;
let ei = end_index;
let mut el = 0;
let mut ec = 0;
{
let mut code_index = 0;
let mut line_index = 0;
let mut column_index = 0;
let mut count = 2;
for c in code.chars() {
if count == 0 {
break;
}
if si == code_index {
sl = line_index;
sc = column_index;
count -= 1;
}
if ei == code_index {
el = line_index;
ec = column_index;
count -= 1;
}
code_index += 1;
if c == '\n' {
line_index += 1;
column_index = 0;
} else {
column_index += 1;
}
}
}
let lines: Vec<&str> = code.split("\n").collect();
let mut msg: Vec<String> = Vec::new();
let end_line_number_string = format!("{}", el + 1);
let mut gutter_size = 0;
gutter_size = std::cmp::max(gutter_size, end_line_number_string.len());
let e_line = lines.get(el).unwrap();
msg.push(String::from(""));
msg.push(format!(" {} | {}", end_line_number_string, e_line));
msg.push(format!(
" {} | {}^",
" ".repeat(gutter_size),
" ".repeat(ec)
));
msg.push(String::from(""));
msg.push(format!("{}", error_message));
let error_message = msg.join("\n");
ParsingError {
error_code,
error_message,
}
}
}