Fix macro

This commit is contained in:
Gavrilikhin Daniil 2023-05-12 21:28:52 +08:00
parent 55f41a6bdb
commit 3e622128e8
4 changed files with 59 additions and 46 deletions

View File

@ -55,7 +55,7 @@
/// fn divide(x: f64, y: f64) -> Result<f64> { /// fn divide(x: f64, y: f64) -> Result<f64> {
/// if y.abs() < 1e-3 { /// if y.abs() < 1e-3 {
/// bail!( /// bail!(
/// severity = Severity::Warning; /// severity = Severity::Warning,
/// "dividing by value ({y}) close to 0" /// "dividing by value ({y}) close to 0"
/// ); /// );
/// } /// }
@ -64,16 +64,13 @@
/// ``` /// ```
#[macro_export] #[macro_export]
macro_rules! bail { macro_rules! bail {
($err:expr $(,)?) => { ($($key:ident = $value:expr,)* $fmt:literal $($arg:tt)*) => {
return $crate::private::Err($crate::miette!($err));
};
($($key:ident = $value:expr),+; $($fmt:tt)+) => {
return $crate::private::Err( return $crate::private::Err(
$crate::miette!($($key = $value),+; $($fmt)+) $crate::miette!($($key = $value,)* $fmt $($arg)*)
); );
}; };
($($fmt:tt)+) => { ($err:expr $(,)?) => {
return $crate::private::Err($crate::miette!($($fmt)+)); return $crate::private::Err($crate::miette!($err));
}; };
} }
@ -128,7 +125,7 @@ macro_rules! bail {
/// fn divide(x: f64, y: f64) -> Result<f64> { /// fn divide(x: f64, y: f64) -> Result<f64> {
/// ensure!( /// ensure!(
/// y.abs() >= 1e-3, /// y.abs() >= 1e-3,
/// severity = Severity::Warning; /// severity = Severity::Warning,
/// "dividing by value ({y}) close to 0" /// "dividing by value ({y}) close to 0"
/// ); /// );
/// Ok(x / y) /// Ok(x / y)
@ -136,21 +133,16 @@ macro_rules! bail {
/// ``` /// ```
#[macro_export] #[macro_export]
macro_rules! ensure { macro_rules! ensure {
($cond:expr, $err:expr $(,)?) => { ($cond:expr, $($key:ident = $value:expr,)* $fmt:literal $($arg:tt)*) => {
if !$cond {
return $crate::private::Err($crate::miette!($err));
}
};
($cond:expr, $($key:ident = $value:expr),+; $($fmt:tt)+) => {
if !$cond { if !$cond {
return $crate::private::Err( return $crate::private::Err(
$crate::miette!($($key = $value),+; $($fmt)+) $crate::miette!($($key = $value,)* $fmt $($arg)*)
); );
} }
}; };
($cond:expr, $fmt:expr, $($arg:tt)*) => { ($cond:expr, $err:expr $(,)?) => {
if !$cond { if !$cond {
return $crate::private::Err($crate::miette!($fmt, $($arg)*)); return $crate::private::Err($crate::miette!($err));
} }
}; };
} }
@ -167,7 +159,8 @@ macro_rules! ensure {
/// let report = miette!("{x} + {} = {z}", y, z = x + y); /// let report = miette!("{x} + {} = {z}", y, z = x + y);
/// assert_eq!(report.to_string().as_str(), "1 + 2 = 3"); /// assert_eq!(report.to_string().as_str(), "1 + 2 = 3");
/// ///
/// let report = miette!("{x} + {y} = {x + y}"); /// let z = x + y;
/// let report = miette!("{x} + {y} = {z}");
/// assert_eq!(report.to_string().as_str(), "1 + 2 = 3"); /// assert_eq!(report.to_string().as_str(), "1 + 2 = 3");
/// ``` /// ```
/// ///
@ -182,8 +175,7 @@ macro_rules! ensure {
/// code = "expected::rparen", /// code = "expected::rparen",
/// help = "always close your parens", /// help = "always close your parens",
/// labels = vec![LabeledSpan::at_offset(6, "here")], /// labels = vec![LabeledSpan::at_offset(6, "here")],
/// url = "https://example.com"; // <- semicolon separates fields from message /// url = "https://example.com",
///
/// // Rest of the arguments are passed to `format!` /// // Rest of the arguments are passed to `format!`
/// // to form diagnostic message /// // to form diagnostic message
/// "expected closing ')'" /// "expected closing ')'"
@ -196,19 +188,16 @@ macro_rules! ensure {
/// You can just replace `use`s of the `anyhow!`/`eyre!` macros with `miette!`. /// You can just replace `use`s of the `anyhow!`/`eyre!` macros with `miette!`.
#[macro_export] #[macro_export]
macro_rules! miette { macro_rules! miette {
($($key:ident = $value:expr,)* $fmt:literal $($arg:tt)*) => {
$crate::Report::from(
$crate::diagnostic!($($key = $value,)* $fmt $($arg)*)
)
};
($err:expr $(,)?) => ({ ($err:expr $(,)?) => ({
use $crate::private::kind::*; use $crate::private::kind::*;
let error = $err; let error = $err;
(&error).miette_kind().new(error) (&error).miette_kind().new(error)
}); });
($($key:ident = $value:expr),+; $($fmt:tt)+) => {
$crate::Report::from(
$crate::diagnostic!($($key = $value),+; $($fmt)+)
)
};
($($fmt:tt)+) => {
$crate::private::new_adhoc(format!($($fmt)+))
};
} }
/// Construct a [`MietteDiagnostic`] in more user-friendly way. /// Construct a [`MietteDiagnostic`] in more user-friendly way.
@ -224,8 +213,7 @@ macro_rules! miette {
/// code = "expected::rparen", /// code = "expected::rparen",
/// help = "always close your parens", /// help = "always close your parens",
/// labels = vec![LabeledSpan::at_offset(6, "here")], /// labels = vec![LabeledSpan::at_offset(6, "here")],
/// url = "https://example.com"; // <- semicolon separates fields from message /// url = "https://example.com",
///
/// // Rest of the arguments are passed to `format!` /// // Rest of the arguments are passed to `format!`
/// // to form diagnostic message /// // to form diagnostic message
/// "expected closing ')'", /// "expected closing ')'",
@ -239,15 +227,16 @@ macro_rules! miette {
/// ///
/// let diag = diagnostic!("{x} + {} = {z}", y, z = x + y); /// let diag = diagnostic!("{x} + {} = {z}", y, z = x + y);
/// assert_eq!(diag.message, "1 + 2 = 3"); /// assert_eq!(diag.message, "1 + 2 = 3");
///
/// let z = x + y;
/// let diag = diagnostic!("{x} + {y} = {z}");
/// assert_eq!(diag.message, "1 + 2 = 3");
/// ``` /// ```
#[macro_export] #[macro_export]
macro_rules! diagnostic { macro_rules! diagnostic {
($($key:ident = $value:expr),+; $($fmt:tt)+) => {{ ($($key:ident = $value:expr,)* $fmt:literal $($arg:tt)*) => {{
let mut diag = $crate::MietteDiagnostic::new(format!($($fmt)+)); let mut diag = $crate::MietteDiagnostic::new(format!($fmt $($arg)*));
$(diag.$key = Some($value.into());)* $(diag.$key = Some($value.into());)*
diag diag
}}; }};
($($fmt:tt)+) => {{
$crate::MietteDiagnostic::new(format!($($fmt)+))
}};
} }

View File

@ -604,11 +604,11 @@
//! //!
//! let source = "2 + 2 * 2 = 8".to_string(); //! let source = "2 + 2 * 2 = 8".to_string();
//! let report = miette!( //! let report = miette!(
//! "Wrong answer",
//! labels = vec[ //! labels = vec[
//! LabeledSpan::at(12..13, "this should be 6"), //! LabeledSpan::at(12..13, "this should be 6"),
//! ], //! ],
//! help = "'*' has greater precedence than '+'" //! help = "'*' has greater precedence than '+'",
//! "Wrong answer"
//! ).with_source_code(source); //! ).with_source_code(source);
//! println!("{:?}", report) //! println!("{:?}", report)
//! ``` //! ```

View File

@ -1,7 +1,7 @@
use miette::{miette, Report}; use miette::{miette, Report};
fn error() -> Report { fn error() -> Report {
miette!(0).wrap_err(1).wrap_err(2).wrap_err(3) miette!("0").wrap_err(1).wrap_err(2).wrap_err(3)
} }
#[test] #[test]

View File

@ -3,7 +3,7 @@ mod drop;
use self::common::*; use self::common::*;
use self::drop::{DetectDrop, Flag}; use self::drop::{DetectDrop, Flag};
use miette::{Diagnostic, Report}; use miette::{Diagnostic, MietteDiagnostic, Report};
use std::error::Error as StdError; use std::error::Error as StdError;
use std::fmt::{self, Display}; use std::fmt::{self, Display};
use std::io; use std::io;
@ -12,11 +12,19 @@ use std::io;
fn test_downcast() { fn test_downcast() {
assert_eq!( assert_eq!(
"oh no!", "oh no!",
bail_literal().unwrap_err().downcast::<&str>().unwrap(), bail_literal()
.unwrap_err()
.downcast::<MietteDiagnostic>()
.unwrap()
.message,
); );
assert_eq!( assert_eq!(
"oh no!", "oh no!",
bail_fmt().unwrap_err().downcast::<String>().unwrap(), bail_fmt()
.unwrap_err()
.downcast::<MietteDiagnostic>()
.unwrap()
.message,
); );
assert_eq!( assert_eq!(
"oh no!", "oh no!",
@ -32,11 +40,19 @@ fn test_downcast() {
fn test_downcast_ref() { fn test_downcast_ref() {
assert_eq!( assert_eq!(
"oh no!", "oh no!",
*bail_literal().unwrap_err().downcast_ref::<&str>().unwrap(), bail_literal()
.unwrap_err()
.downcast_ref::<MietteDiagnostic>()
.unwrap()
.message,
); );
assert_eq!( assert_eq!(
"oh no!", "oh no!",
bail_fmt().unwrap_err().downcast_ref::<String>().unwrap(), bail_fmt()
.unwrap_err()
.downcast_ref::<MietteDiagnostic>()
.unwrap()
.message,
); );
assert_eq!( assert_eq!(
"oh no!", "oh no!",
@ -52,11 +68,19 @@ fn test_downcast_ref() {
fn test_downcast_mut() { fn test_downcast_mut() {
assert_eq!( assert_eq!(
"oh no!", "oh no!",
*bail_literal().unwrap_err().downcast_mut::<&str>().unwrap(), bail_literal()
.unwrap_err()
.downcast_mut::<MietteDiagnostic>()
.unwrap()
.message,
); );
assert_eq!( assert_eq!(
"oh no!", "oh no!",
bail_fmt().unwrap_err().downcast_mut::<String>().unwrap(), bail_fmt()
.unwrap_err()
.downcast_mut::<MietteDiagnostic>()
.unwrap()
.message,
); );
assert_eq!( assert_eq!(
"oh no!", "oh no!",