| Crates.io | macro-v |
| lib.rs | macro-v |
| version | 0.1.4 |
| created_at | 2023-03-11 15:26:54.237156+00 |
| updated_at | 2023-08-08 02:10:04.328579+00 |
| description | Attribute macro for making the visibility of the `macro_rules!` macro the same as other items. |
| homepage | https://github.com/ZihanType/macro-v |
| repository | https://github.com/ZihanType/macro-v |
| max_upload_size | |
| id | 807333 |
| size | 9,886 |
This crate provides an attribute macro for making the visibility of the macro_rules! macro the same as other items.
The visibility of declarative macros is not consistent with the behavior of other items in rust, necessitating the use of #[macro_use] and #[macro_export] instead of pub or pub(...), such inconsistencies make the mental burden and cognitive cost significant. Now with this crate, you are allowed to use #[macro_v] or #[macro_v(pub)] or #[macro_v(pub(...))] on any macro_rules! macro, giving declarative macros the same visibility as other items, no more writing confusing #[macro_use] and #[macro_export].
Inspired by macro-vis and even named after a part of it, but there are two problems of macro-vis:
you have to add #![allow(uncommon_codepoints)].
the modified macro is shown in the documentation as a function instead of a macro.
To solve these two problems, I've reimplemented an attribute macro.
It's very simple, see the code:
#[macro_v(pub(crate))]
macro_rules! example_macro { () => {}; }
... will expand to this:
#[doc(hidden)]
macro_rules! __example_macro_2228885075611141983 { () => {}; }
#[doc(inline)]
pub(crate) use __example_macro_2228885075611141983 as example_macro;
If you are using #[macro_v(pub)], then the expanded code will then have #[macro_export] added to it:
#[doc(hidden)]
#[macro_export]
macro_rules! __example_macro_2228885075611141983 { () => {}; }
#[doc(inline)]
pub use __example_macro_2228885075611141983 as example_macro;
Because of using #[doc(hidden)], you must use #[doc(inline)] attribute when re-exporting, otherwise re-exported macro won't be visible in the document. When using #[macro_v], #[doc(inline)] will be added automatically, but if you want to manually re-export the macro, you must also manually add #[doc(inline)], which is the only problem.