Add `miette_diagnostic!`

This commit is contained in:
Gavrilikhin Daniil 2023-05-06 22:41:33 +08:00
parent bcf18f8151
commit 287ffc54ac
1 changed files with 29 additions and 5 deletions

View File

@ -176,12 +176,36 @@ macro_rules! miette {
let error = $err;
(&error).miette_kind().new(error)
});
($fmt:expr $(, $key:ident = $value:expr)* $(,)?) => {{
let mut diag = $crate::MietteDiagnostic::new(format!("{}", $fmt));
$(diag.$key = Some($value.into());)*
$crate::Report::from(diag)
}};
($fmt:expr $(, $key:ident = $value:expr)* $(,)?) => {
$crate::Report::from($crate::miette_diagnostic!($fmt, $($key = $value,)*))
};
($fmt:expr, $($arg:tt)*) => {
$crate::private::new_adhoc(format!($fmt, $($arg)*))
};
}
/// Construct a [`MietteDiagnostic`] in more user-friendly way.
///
/// # Examples
/// ```
/// use miette::{miette_diagnostic, LabeledSpan, Severity};
///
/// let source = "(2 + 2".to_string();
/// let diag = miette_diagnostic!(
/// "expected closing ')'",
/// // Those fields are optional
/// severity = Severity::Error,
/// code = "expected::rparen",
/// help = "always close your parens",
/// labels = vec![LabeledSpan::at_offset(6, "here")],
/// url = "https://example.com"
/// );
/// ```
#[macro_export]
macro_rules! miette_diagnostic {
($fmt:expr $(, $key:ident = $value:expr)* $(,)?) => {{
let mut diag = $crate::MietteDiagnostic::new(format!("{}", $fmt));
$(diag.$key = Some($value.into());)*
diag
}};
}