use { ariadne::{ColorGenerator, Label, Report, ReportKind, Source}, std::{ error::Error, io::{stdin, Read}, }, }; fn main() -> Result<(), Box> { let mut code = String::new(); stdin().read_to_string(&mut code)?; let mut buf = vec![]; if let Err(e) = hbasm::text::assembly(&code, &mut buf) { let mut colors = ColorGenerator::new(); let e_code = match e.kind { hbasm::text::ErrorKind::UnexpectedToken => 1, hbasm::text::ErrorKind::InvalidToken => 2, hbasm::text::ErrorKind::UnexpectedEnd => 3, hbasm::text::ErrorKind::InvalidSymbol => 4, }; let message = match e.kind { hbasm::text::ErrorKind::UnexpectedToken => "This token is not expected!", hbasm::text::ErrorKind::InvalidToken => "The token is not valid!", hbasm::text::ErrorKind::UnexpectedEnd => "The assembler reached the end of input unexpectedly!", hbasm::text::ErrorKind::InvalidSymbol => "This referenced symbol doesn't have a corresponding label!", }; let a = colors.next(); Report::build(ReportKind::Error, "engine_internal", e.span.clone().start) .with_code(e_code) .with_message(format!("{:?}", e.kind)) .with_label( Label::new(("engine_internal", e.span.clone())) .with_message(message) .with_color(a), ) .finish() .eprint(("engine_internal", Source::from(&code))) .unwrap(); } Ok(()) }