mod bit_enum;
mod codegen;
mod model;
mod ordering;
mod parse;
mod validate;
use proc_macro::TokenStream;
use syn::spanned::Spanned;
use model::BitfieldArgs;
#[proc_macro_attribute]
pub fn bitfield(attr: TokenStream, item: TokenStream) -> TokenStream {
match bitfield_impl(attr, item) {
Ok(ts) => ts,
Err(e) => e.to_compile_error().into(),
}
}
fn bitfield_impl(attr: TokenStream, item: TokenStream) -> syn::Result<TokenStream> {
let args = syn::parse::<BitfieldArgs>(attr)?;
let item_struct = syn::parse::<syn::ItemStruct>(item)?;
let def = parse::parse_struct(&args, &item_struct)?;
validate::validate(&def)?;
let output = codegen::generate(&def);
Ok(output.into())
}
#[proc_macro_attribute]
pub fn bitenum(attr: TokenStream, item: TokenStream) -> TokenStream {
match bitenum_impl(attr, item) {
Ok(ts) => ts,
Err(e) => e.to_compile_error().into(),
}
}
fn bitenum_impl(attr: TokenStream, item: TokenStream) -> syn::Result<TokenStream> {
if !attr.is_empty() {
return Err(syn::Error::new(
proc_macro2::TokenStream::from(attr).span(),
"bitenum takes no arguments",
));
}
let item_enum = syn::parse::<syn::ItemEnum>(item)?;
bit_enum::generate(item_enum).map(Into::into)
}