1#![doc = include_str!("../README.md")]
2#![warn(clippy::unused_trait_names, clippy::pedantic)]
3#![allow(
4 clippy::redundant_closure_for_method_calls,
5 clippy::enum_glob_use,
6 clippy::missing_errors_doc,
7 clippy::semicolon_if_nothing_returned,
8)]
9
10extern crate proc_macro;
11
12mod span;
13mod exts;
14mod kind;
15mod parse_iter;
16mod func_utils;
17
18pub use span::*;
19pub use exts::*;
20pub use kind::*;
21pub use parse_iter::*;
22pub use func_utils::*;
23
24#[macro_export]
28macro_rules! err {
29 ($msg:expr $(,)?) => { $crate::err!($msg, ::proc_macro::Span::call_site()) };
30 ($msg:expr , $span:expr $(,)?) => {
31 return $crate::err($msg, &$span)
32 };
33 (@($($f:tt)*) $($rest:tt)*) => {
34 $crate::err!(&::std::format!($($f)*) $($rest)*)
35 };
36 (@$f:literal $($rest:tt)*) => {
37 $crate::err!(&::std::format!($f) $($rest)*)
38 };
39}
40
41#[macro_export]
45macro_rules! rerr {
46 ($msg:expr $(,)?) => { $crate::rerr!($msg, ::proc_macro::Span::call_site()) };
47 ($msg:expr , $span:expr $(,)?) => {
48 return $crate::rerr($msg, &$span)
49 };
50 (@($($f:tt)*) $($rest:tt)*) => {
51 $crate::rerr!(&::std::format!($($f)*) $($rest)*)
52 };
53 (@$f:literal $($rest:tt)*) => {
54 $crate::rerr!(&::std::format!($f) $($rest)*)
55 };
56}
57
58#[cfg(test)]
59mod tests {
60 use super::*;
61
62 #[deny(unused)]
63 fn _test_rerr() -> Result<(), proc_macro::TokenStream> {
64 let msg = "abc";
65 rerr!(@"{msg}");
66 }
67}