zyn 0.5.4

A proc macro framework with templates, composable elements, and built-in diagnostics
Documentation
#![feature(test)]

extern crate test;

use darling::FromDeriveInput;
use test::{Bencher, black_box};
use zyn::quote::quote;
use zyn_core::FromInput;

#[derive(darling::FromDeriveInput)]
#[darling(attributes(my_attr))]
#[allow(dead_code)]
struct DarlingArgs {
    name: String,
    count: i64,
}

#[derive(zyn::Attribute)]
#[zyn("my_attr")]
#[allow(dead_code)]
struct ZynArgs {
    name: String,
    count: i64,
}

fn make_ts() -> zyn::proc_macro2::TokenStream {
    quote! {
        #[my_attr(name = "hello", count = 5)]
        pub struct UserRecord {
            pub user_id: u64,
            pub first_name: String,
        }
    }
}

#[bench]
fn attr_parse(b: &mut Bencher) {
    let ts = make_ts();
    b.iter(|| black_box(zyn::syn::parse2::<zyn::syn::DeriveInput>(black_box(ts.clone())).unwrap()))
}

#[bench]
fn attr_darling(b: &mut Bencher) {
    let ts = make_ts();
    let ast: zyn::syn::DeriveInput = zyn::syn::parse2(ts).unwrap();
    b.iter(|| black_box(DarlingArgs::from_derive_input(black_box(&ast)).unwrap()))
}

#[bench]
fn attr_zyn(b: &mut Bencher) {
    let ts = make_ts();
    let input: zyn_core::Input = zyn::syn::parse2(ts).unwrap();
    b.iter(|| black_box(ZynArgs::from_input(black_box(&input)).unwrap()))
}