fn mutatable_enum()

in lain_derive/src/mutations.rs [107:143]


fn mutatable_enum(variants: &[Variant], cont_ident: &syn::Ident) -> TokenStream {
    let constraints_prelude = mutatable_constraints_prelude();
    let match_arms = mutatable_enum_visitor(variants, cont_ident);

    if match_arms.is_empty() {
        return TokenStream::new();
    }

    quote! {
        // 10% chance to re-generate this field
        if mutator.gen_chance(0.10) {
            *self = Self::new_fuzzed(mutator, parent_constraints.and_then(|constraints| {
                let mut constraints = constraints.clone();

                // If base object size has already been accounted for, that means
                // the max_size represents the amount of extra data that may be consumed.
                // We want to give back the size of this object when generating a new instance
                if constraints.base_object_size_accounted_for {
                    if let Some(max_size) = constraints.max_size.as_mut() {
                        *max_size = self.serialized_size() + *max_size;
                    }
                }

                Some(constraints)
            }).as_ref());

            return;
        }

        #constraints_prelude

        match *self {
            #(#match_arms)*
            _ => { /* ignore these */ }
        }
    }
}