holey-bytes/hbasm/src/main.rs

47 lines
1.5 KiB
Rust
Raw Normal View History

2023-07-11 04:08:20 -05:00
use {
ariadne::{ColorGenerator, Label, Report, ReportKind, Source},
std::{
error::Error,
io::{stdin, Read},
},
};
fn main() -> Result<(), Box<dyn Error>> {
let mut code = String::new();
stdin().read_to_string(&mut code)?;
let mut buf = vec![];
2023-07-11 04:08:20 -05:00
2023-07-10 16:18:23 -05:00
if let Err(e) = hbasm::text::assembly(&code, &mut buf) {
2023-07-11 04:08:20 -05:00
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,
};
2023-07-11 04:24:49 -05:00
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!",
};
2023-07-11 04:08:20 -05:00
let a = colors.next();
2023-07-11 04:24:49 -05:00
Report::build(ReportKind::Error, "engine_internal", e.span.clone().start)
2023-07-11 04:08:20 -05:00
.with_code(e_code)
.with_message(format!("{:?}", e.kind))
.with_label(
Label::new(("engine_internal", e.span.clone()))
2023-07-11 04:24:49 -05:00
.with_message(message)
2023-07-11 04:08:20 -05:00
.with_color(a),
)
.finish()
.eprint(("engine_internal", Source::from(&code)))
.unwrap();
}
2023-07-11 04:08:20 -05:00
Ok(())
}