17 个版本
0.0.17 | 2024 年 6 月 14 日 |
---|---|
0.0.16 | 2024 年 1 月 16 日 |
0.0.15 | 2023 年 10 月 17 日 |
0.0.14 | 2023 年 6 月 2 日 |
0.0.3 | 2021 年 12 月 14 日 |
#84 in Rust 模式
168,289 每月下载量
在 45 个 软件包中使用 (直接使用 9)
185KB
3.5K SLoC
美德,一个无副作用的 derive 宏助手
目标
- 无依赖,编译速度快
- 无需其他依赖
- 声明式代码生成
- 尽可能多的类型系统检查
- 为现代 Rust 构建:1.57 及以上
- 考虑流行的软件包构建
- 始终遵守 semver。次要版本发布永远不会包含
- 破坏性 API 更改
- MSRV 更改
示例
use virtue::prelude::*;
#[proc_macro_derive(YourDerive, attributes(some, attributes, go, here))]
pub fn derive_your_derive(input: TokenStream) -> TokenStream {
derive_your_derive_inner(input)
.unwrap_or_else(|error| error.into_token_stream())
}
fn derive_your_derive_inner(input: TokenStream) -> Result<TokenStream> {
// Parse the struct or enum you want to implement a derive for
let parse = Parse::new(input)?;
// Get a reference to the generator
let (mut generator, body) = parse.into_generator();
match body {
Body::Struct(body) => {
// Implement your struct body here
// See `Generator` for more information
generator.impl_for("YourTrait")?
.generate_fn("your_fn")
.with_self_arg(FnSelfArg::RefSelf)
.body(|fn_body| {
fn_body.push_parsed("println!(\"Hello world\");");
})?;
},
Body::Enum(body) => {
// Implement your enum body here
// See `Generator` for more information
generator.impl_for("YourTrait")?
.generate_fn("your_fn")
.with_self_arg(FnSelfArg::RefSelf)
.body(|fn_body| {
fn_body.push_parsed("println!(\"Hello world\");");
})?;
},
}
generator.finish()
}
将生成
impl YourTrait for <Struct or Enum> {
fn your_fn(&self) { // .generate_fn("your_fn").with_self_arg(FnSelfArg::RefSelf)
println!("Hello world"); // fn_body.push_parsed(...)
}
}