2 releases
0.1.1 | Sep 4, 2021 |
---|---|
0.1.0 | Aug 25, 2021 |
#1881 in Rust patterns
5KB
codespan-derive
Derive macro for ergonomically creating a Diagnostic from an error macro
Usage
- Add
#[derive(IntoDiagnostic)]
onto your error macro type. - Add a
#[file_id(Type)]
to signal what theFileId
generic type of theDiagnostic
will be. - Tag every variant with a
#[message = ""]
signalling what the error message should read. - Span-like values that implement
IntoLabel
can be tagged with#[primary]
or#[secondary]
to be marked in the generated error, with an optional message like#[primary = ""]
.
#[derive(IntoDiagnostic)]
#[file_id(SomeFileIdType)]
enum Error {
#[message = "Compiler found the number `{0}` is too large"]
NumberTooLarge(usize),
#[message = "Cannot parse string {string}"]
BadString {
string: String,
#[primary = "The bad string appears here"]
span: Span,
},
}
Then handle it somewhere like:
if let Some(err) = result {
// IntoDiagnostic derived from macro
let diagnostic = err.into_diagnostic();
// Basic codespan-diagnostic printing to terminal
let writer = StandardStream::stderr(ColorChoice::Always);
let config = codespan_reporting::term::Config::default();
term::emit(&mut writer.lock(), &config, &files, &diagnostic)?;
}
Dependencies
~2.6–9.5MB
~96K SLoC