lib/scanner: improve tokens! macro error reporting

This commit is contained in:
Paul Stemmet 2021-06-02 18:10:09 +00:00 committed by Paul Stemmet
parent 9ecea201c8
commit 68cc3f7342
3 changed files with 29 additions and 3 deletions

7
Cargo.lock generated
View file

@ -9,6 +9,12 @@ dependencies = [
"winapi", "winapi",
] ]
[[package]]
name = "anyhow"
version = "1.0.40"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "28b2cd92db5cbd74e8e5028f7e27dd7aa3090e89e4f2a197cc7c8dfb69c7063b"
[[package]] [[package]]
name = "ctor" name = "ctor"
version = "0.1.20" version = "0.1.20"
@ -107,5 +113,6 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
name = "yary" name = "yary"
version = "0.1.0" version = "0.1.0"
dependencies = [ dependencies = [
"anyhow",
"pretty_assertions", "pretty_assertions",
] ]

View file

@ -9,4 +9,5 @@ edition = "2018"
[dependencies] [dependencies]
[dev-dependencies] [dev-dependencies]
anyhow = "1"
pretty_assertions = "0.7" pretty_assertions = "0.7"

View file

@ -6,7 +6,15 @@
/// <message> A message to print on failure /// <message> A message to print on failure
macro_rules! tokens { macro_rules! tokens {
($scanner:expr => $($id:tt $expected:expr $(=> $msg:tt)?),+ ) => { ($scanner:expr => $($id:tt $expected:expr $(=> $msg:tt)?),+ ) => {
$( tokens!(@unwrap $id $scanner => $expected $(=> $msg)? ) );+ let mut f = || -> std::result::Result<(), ::anyhow::Error> {
$( tokens!(@unwrap $id $scanner => $expected $(=> $msg)? ); )+
Ok(())
};
if let Err(e) = f() {
panic!("tokens! error: {}", e)
}
}; };
// <-- PRIVATE VARIANTS --> // <-- PRIVATE VARIANTS -->
@ -25,11 +33,21 @@ macro_rules! tokens {
}; };
// Variant for token assert, no message // Variant for token assert, no message
(@token $scanner:expr => $expected:expr) => { (@token $scanner:expr => $expected:expr) => {
assert_eq!($scanner.next().expect("Unexpected end of events"), $expected) let event = $scanner
.next()
.ok_or_else(
|| anyhow::anyhow!("Unexpected end of tokens, was expecting: {:?} ~{}", $expected, $scanner.buffer)
)?;
assert_eq!(event, $expected)
}; };
// Variant for token assert, no with message // Variant for token assert, no with message
(@token $scanner:expr => $expected:expr, $msg:tt) => { (@token $scanner:expr => $expected:expr, $msg:tt) => {
let event = $scanner.next().expect("Unexpected end of events"); let event = $scanner
.next()
.ok_or_else(
|| anyhow::anyhow!("Unexpected end of tokens, {}: {:?} ~{}", $msg, $expected, $scanner.buffer)
)?;
assert_eq!(event, $expected, $msg) assert_eq!(event, $expected, $msg)
}; };