fn mutatable_struct()

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)*
        }
    }
}