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 模式

Download history 45782/week @ 2024-05-04 53070/week @ 2024-05-11 53944/week @ 2024-05-18 52295/week @ 2024-05-25 48529/week @ 2024-06-01 42926/week @ 2024-06-08 42515/week @ 2024-06-15 49505/week @ 2024-06-22 40956/week @ 2024-06-29 42033/week @ 2024-07-06 48352/week @ 2024-07-13 50255/week @ 2024-07-20 42869/week @ 2024-07-27 45287/week @ 2024-08-03 35681/week @ 2024-08-10 35010/week @ 2024-08-17

168,289 每月下载量
45 软件包中使用 (直接使用 9)

MIT 许可证

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(...)
    }
}

依赖