use std::{env::args, fs};
fn print_char_seq(n: usize, ch: char) {
for _ in 0..n {
print!("{ch}");
}
}
fn main() {
let contents =
&fs::read_to_string(args().skip(1).next().expect("expected input grammar file")).unwrap();
match tecta_peg::parse_module(&contents) {
Ok(grammar) => println!("{}", grammar),
Err(error) => {
let span = error.span();
let lines = contents.lines().skip(span.start_line - 1);
for (line_number, line_content) in (span.start_line..=span.end_line).zip(lines) {
println!("{line_number:>5}: {line_content}");
print_char_seq(7, ' ');
if line_number == span.start_line {
print_char_seq(span.start_column - 1, ' ');
print_char_seq(span.end_column - span.start_column + 1, '^');
} else if line_number == span.end_line {
print_char_seq(span.end_column, '^');
} else {
print_char_seq(line_content.len(), '^');
}
println!();
}
println!("error: {error}");
}
}
}