proc_macro_tool/
lib.rs

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/// [`return err(msg [, span])`](err())
25///
26/// `err!(@(...))` like `err!(&format!(...))`
27#[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/// [`return rerr(msg [, span])`](rerr())
42///
43/// `err!(@(...))` like `err!(&format!(...))`
44#[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}