use std::fmt::{Arguments, Debug};
macro_rules! assert_matches {
($left:expr, $($pattern:pat_param)|+ $(if $guard:expr)? $(,)?) => {
match $left {
$($pattern)|+ $(if $guard)? => {}
ref left => {
crate::tests::assert_matches_failed(
left,
stringify!($($pattern)|+ $(if $guard)?),
None,
);
}
}
};
($left:expr, $($pattern:pat_param)|+ $(if $guard:expr)?, $($arg:tt)+) => {
match $left {
$($pattern)|+ $(if $guard)? => {}
ref left => {
crate::tests::assert_matches_failed(
left,
stringify!($($pattern)|+ $(if $guard)?),
Some(format_args!($($arg)+)),
);
}
}
};
}
pub(crate) use assert_matches;
#[track_caller]
pub(crate) fn assert_matches_failed(left: impl Debug, right: &str, message: Option<Arguments<'_>>) {
match message {
Some(message) => panic!(
"{}",
indoc::formatdoc! {"
assertion `left matches right` failed: {message}
left: {left:?}
right: {right:?}
"},
),
None => panic!(
"{}",
indoc::formatdoc! {"
assertion `left matches right` failed
left: {left:?}
right: {right:?}
"},
),
}
}