mod bit_enum;
mod codegen;
mod model;
mod ordering;
mod parse;
mod validate;
use proc_macro::TokenStream;
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_derive(BitEnum)]
pub fn bit_enum(input: TokenStream) -> TokenStream {
match bit_enum_impl(input) {
Ok(ts) => ts,
Err(e) => e.to_compile_error().into(),
}
}
fn bit_enum_impl(input: TokenStream) -> syn::Result<TokenStream> {
let input = syn::parse::<syn::DeriveInput>(input)?;
bit_enum::generate(input).map(Into::into)
}