#[cfg(test)]
mod tests;
pub(super) fn split_statements(file: &str) -> Vec<(String, usize)> {
let mut statements = vec![];
let mut build_line = String::new();
let mut build_multiline: Option<(String, usize)> = None;
let mut current_line_number = 1;
let mut is_comment = false;
for ch in file.chars() {
match ch {
'\n' | ';' if build_multiline.is_none() => {
is_comment = false;
if !build_line.is_empty() {
statements.push((build_line, current_line_number));
build_line = String::new();
}
}
'\n' => (),
';' => {
is_comment = false;
let (multiline, number) = build_multiline.unwrap();
build_line.push_str(&multiline);
build_multiline = None;
if !build_line.is_empty() {
statements.push((build_line, number));
build_line = String::new();
}
}
'&' if !is_comment => match &mut build_multiline {
None => {
build_multiline = Some((String::new(), current_line_number))
}
Some(_) => {
build_line.push(ch);
}
},
'#' if build_line.trim().is_empty() => {
is_comment = true;
}
_ if is_comment => continue,
_ => build_line.push(ch),
}
if ch == '\n' {
current_line_number += 1;
}
}
let start_line_number = match build_multiline {
None => current_line_number,
Some((multiline, number)) => {
build_line.push_str(&multiline);
number
}
};
if !build_line.is_empty() {
statements.push((build_line, start_line_number));
}
statements
}