in lain_derive/src/mutations.rs [174:210]
fn mutatable_struct(fields: &[Field]) -> TokenStream {
let mutators = mutatable_struct_visitor(fields);
let prelude = mutatable_constraints_prelude();
if mutators.is_empty() {
return TokenStream::new();
}
let len = mutators.len();
let mut match_arms = vec![];
for (i, mutator) in mutators.iter().enumerate() {
match_arms.push(quote! {
#i => {
#mutator
}
});
}
quote! {
use _lain::rand::seq::index::sample;
#prelude
if Self::is_variable_size() {
// this makes for ugly code generation, but better perf
for i in sample(&mut mutator.rng, #len, #len).iter() {
match i {
#(#match_arms)*
_ => unreachable!(),
}
}
} else {
#(#mutators)*
}
}
}