mod analyse;
mod config;
mod expand;
mod field_config;
mod field_info;
mod params;
use self::{config::Config, params::ParamArgs};
use core::convert::TryFrom;
use proc_macro2::{Span, TokenStream as TokenStream2};
use syn::{self, parse::Result};
pub fn analyse_and_expand(args: TokenStream2, input: TokenStream2) -> TokenStream2 {
match analyse_and_expand_or_error(args, input) {
Ok(output) => output,
Err(err) => err.to_compile_error(),
}
}
fn analyse_and_expand_or_error(args: TokenStream2, input: TokenStream2) -> Result<TokenStream2> {
let input = syn::parse2::<syn::ItemStruct>(input)?;
let params = syn::parse2::<ParamArgs>(args)?;
let mut config = Config::default();
config.feed_params(params)?;
let bitfield = BitfieldStruct::try_from((&mut config, input))?;
Ok(bitfield.expand(&config))
}
struct BitfieldStruct {
item_struct: syn::ItemStruct,
}
fn raise_skip_error(skip_params: &str, span: Span, previous: Span) -> Result<()> {
Err(crate::errors::CombineError::into_combine(
format_err!(
span,
"encountered duplicate `#[skip{}]` attribute for field",
skip_params
),
format_err!(previous, "duplicate `#[skip{}]` here", skip_params),
))
}