15 个版本 (稳定)
3.0.0 | 2023年7月24日 |
---|---|
2.1.2 | 2022年5月26日 |
1.1.2 | 2022年5月6日 |
1.1.1 | 2021年7月15日 |
0.3.3 | 2020年9月6日 |
#549 in Rust 模式
每月下载量 2,184
用于 16 个软件包 (直接使用10个)
13KB
197 行
macro-attr-2018
macro-attr
的现代分支。
该软件包提供了 macro_attr!
宏,该宏允许使用基于宏的自定义推导。
应使用 macro_attr!
宏来包裹整个 单个 项目(例如 enum
、struct
等)声明,包括其属性(包括 derive
和其他属性)。所有以 !
结尾的推导都将假定由宏实现,并相应处理。
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 }
}