rose-bitset-derive 0.1.0-beta

Procedural macros internal to the 'rose-bitsets' crate.
Documentation
extern crate proc_macro;
extern crate proc_macro2;

mod extras;
mod impls;
mod type_utils;

use extras::Extras;
use proc_macro::TokenStream;
use proc_macro_error::{abort, proc_macro_error};
use proc_macro2::TokenStream as TokenStream2;
use syn::{DeriveInput, parse_macro_input, spanned::Spanned};

#[proc_macro_error]
#[proc_macro_derive(BitSet, attributes(bitset))]
pub fn bitset_derive(input: TokenStream) -> TokenStream {
    let DeriveInput {
        attrs,
        ident,
        data,
        generics,
        ..
    } = parse_macro_input!(input as DeriveInput);
    if !generics.params.is_empty() {
        abort!(
            generics.span(), "unexpected generics";
            note = "`BitSet` cannot be derived for generic types";
        );
    }
    let uint = impls::main::get_uint(data);

    let iter_impls = if let Some(bitset_attribute) = attrs
        .iter()
        .find(|attribute| attribute.meta.path().is_ident("bitset"))
    {
        Extras::generate_code_from_attribute(bitset_attribute, &ident, &uint)
    } else {
        TokenStream2::new()
    };
    let mut impls = impls::main::generate_code(ident, uint);
    impls.extend(iter_impls);
    impls.into()
}