in lain_derive/src/mutations.rs [533:584]
fn field_initializer(
field: &Field,
name_prefix: &'static str,
) -> (TokenStream, String, TokenStream) {
let default_constraints = struct_field_constraints(field, false);
let ty = &field.ty;
let field_ident_string = match field.member {
syn::Member::Named(ref ident) => ident.to_string(),
syn::Member::Unnamed(ref idx) => idx.index.to_string(),
};
let value_ident =
TokenStream::from_str(&format!("{}{}", name_prefix, field_ident_string)).unwrap();
let default_initializer = quote! {
<#ty>::new_fuzzed(mutator, constraints.as_ref())
};
let initializer = if field.attrs.ignore() {
quote! {
let #value_ident = <#ty>::default();
}
} else if let Some(chance) = field.attrs.ignore_chance() {
quote_spanned! { ty.span() =>
let #value_ident = if mutator.gen_chance(#chance) {
<#ty>::default()
} else {
#default_initializer
};
}
} else if let Some(initializer) = field.attrs.initializer() {
quote_spanned! { initializer.span() =>
let #value_ident = #initializer;
}
} else {
quote_spanned! { ty.span() =>
// println!("{:?}", constraints);
let #value_ident = #default_initializer;
}
};
let inc_max_size = decrement_max_size(&field, &value_ident);
let initializer = quote! {
#default_constraints
#initializer
#inc_max_size
};
(value_ident, field_ident_string, initializer)
}