Use miette for reporting errors

This gives us errors with annotated context like this:

```
Error:
  × type error: Unknown variable 'x'
    ╭─[isle_examples/let.isle:24:1]
 24 │   (Lower (B.B z))
 25 │   (A.Add x y))
    ·          ┬
    ·          ╰── Unknown variable 'x'
    ╰────
```
This commit is contained in:
Nick Fitzgerald
2021-09-28 14:51:02 -07:00
committed by Chris Fallin
parent 38da2cee3e
commit 6ffb02d9f6
10 changed files with 415 additions and 68 deletions

View File

@@ -10,3 +10,4 @@ log = "0.4"
isle = { version = "*", path = "../isle/" }
env_logger = { version = "0.8", default-features = false }
clap = "2.33"
miette = { version = "3.0.0", features = ["fancy"] }

View File

@@ -1,10 +1,20 @@
use clap::{App, Arg};
use isle::{compile, lexer, parser};
use miette::{IntoDiagnostic, Result};
use isle::{error, lexer, parser, compile};
fn main() -> Result<(), error::Error> {
fn main() -> Result<()> {
let _ = env_logger::try_init();
let _ = miette::set_hook(Box::new(|_| {
Box::new(
miette::MietteHandlerOpts::new()
// `miette` mistakenly uses braille-optimized output for emacs's
// `M-x shell`.
.force_graphical(true)
.build(),
)
}));
let matches = App::new("isle")
.version(env!("CARGO_PKG_VERSION"))
.author("Chris Fallin <chris@cfallin.org>")
@@ -37,31 +47,14 @@ fn main() -> Result<(), error::Error> {
let lexer = lexer::Lexer::from_files(input_files)?;
let mut parser = parser::Parser::new(lexer);
let defs = match parser.parse_defs() {
Ok(defs) => defs,
Err(error) => {
eprintln!("{}", error);
eprintln!("Failed to parse input.");
std::process::exit(1);
}
};
let code = match compile::compile(&defs) {
Ok(code) => code,
Err(errors) => {
for error in errors {
eprintln!("{}", error);
}
eprintln!("Failed to compile.");
std::process::exit(1);
}
};
let defs = parser.parse_defs()?;
let code = compile::compile(&defs)?;
{
use std::io::Write;
let mut f = std::fs::File::create(output_file)?;
writeln!(&mut f, "{}", code)?;
let mut f = std::fs::File::create(output_file).into_diagnostic()?;
writeln!(&mut f, "{}", code).into_diagnostic()?;
}
Ok(())
}