| Crates.io | macro-attr-2018 |
| lib.rs | macro-attr-2018 |
| version | 3.0.1 |
| created_at | 2020-09-05 12:10:54.588145+00 |
| updated_at | 2024-09-08 15:02:21.963998+00 |
| description | This crate provides the `macro_attr!` macro that enables the use of custom, macro-based attributes and derivations. |
| homepage | |
| repository | https://github.com/A1-Triard/macro-attr-2018 |
| max_upload_size | |
| id | 285061 |
| size | 25,575 |
macro-attr-2018The macro-attr modern fork.
This crate provides the macro_attr! macro that enables the use of custom, macro-based derivations.
The macro_attr! macro should be used to wrap an entire single item (enum, struct, etc.) declaration,
including its attributes (both derive and others).
All derivations which whose names end with ! will be assumed to be implemented by macros, and treated accordingly.
use macro_attr_2018::macro_attr;
// Define some traits to be derived.
trait TypeName {
fn type_name() -> &'static str;
}
trait ReprType {
type Repr;
}
// Define macros which derive implementations of these macros.
macro_rules! TypeName {
// We can support any kind of item we want.
(() $vis:vis enum $name:ident $($tail:tt)+) => { TypeName! { @impl $name } };
(() $vis:vis struct $name:ident $($tail:tt)+) => { TypeName! { @impl $name } };
// Inner rule to cut down on repetition.
(@impl $name:ident) => {
impl TypeName for $name {
fn type_name() -> &'static str { stringify!($name) }
}
};
}
macro_rules! ReprType {
// Note that we use a "derivation argument" here for the `$repr` type.
(($repr:ty) $vis:vis enum $name:ident $($tail:tt)+) => {
impl ReprType for $name {
type Repr = $repr;
}
};
}
// Derive.
macro_attr! {
#[derive(TypeName!, ReprType!(u16))]
#[repr(u16)]
enum SomeEnum { A, B, C, D }
}