in lain_derive/src/lib.rs [186:247]
fn variable_size_object_helper(input: &DeriveInput) -> TokenStream {
// TODO: refactor this to use the same pattern as Mutatable/NewFuzzed introduced
// in v0.2.0
let imp: TokenStream;
match input.data {
Data::Enum(ref data) => {
let mut simple_variants = true;
for variant in &data.variants {
match variant.fields {
Fields::Unit => {
continue;
}
_ => {
simple_variants = false;
}
}
}
imp = if simple_variants {
quote! {false}
} else {
quote! {true}
};
}
Data::Struct(ref data) => {
if let Fields::Named(ref fields) = data.fields {
if fields.named.len() == 0 {
imp = quote! {false};
} else {
let mut tokens = quote! {false};
for field in fields.named.iter() {
let ty = &field.ty;
tokens.extend(quote_spanned! { field.span() =>
|| <#ty>::is_variable_size()
});
}
imp = tokens;
}
} else {
panic!("Need to add support for unnamed struct fields");
}
}
_ => panic!("Non-enum/struct data types are not supported"),
}
let name = &input.ident;
let (impl_generics, ty_generics, where_clause) = input.generics.split_for_impl();
quote! {
#[allow(clippy)]
#[allow(unknown_lints)]
impl #impl_generics ::lain::traits::VariableSizeObject for #name #ty_generics #where_clause {
fn is_variable_size() -> bool {
#imp
}
}
}
}