(input: &DeriveInput, method: TokenStream)
| 326 | } |
| 327 | |
| 328 | fn generate_fields(input: &DeriveInput, method: TokenStream) -> TokenStream { |
| 329 | let input_id = &input.ident; |
| 330 | let fields: Vec<_> = match input.data { |
| 331 | Data::Enum(ref enum_) => enum_ |
| 332 | .variants |
| 333 | .iter() |
| 334 | .filter_map(|variant| { |
| 335 | if attr_skip(&variant.attrs) { |
| 336 | assert!( |
| 337 | !variant.fields.iter().any(|field| attr_skip(&field.attrs)), |
| 338 | "duplicate #[zeroize] skip flags" |
| 339 | ); |
| 340 | None |
| 341 | } else { |
| 342 | let variant_id = &variant.ident; |
| 343 | Some((quote! { #input_id :: #variant_id }, &variant.fields)) |
| 344 | } |
| 345 | }) |
| 346 | .collect(), |
| 347 | Data::Struct(ref struct_) => vec![(quote! { #input_id }, &struct_.fields)], |
| 348 | Data::Union(ref union_) => panic!("Cannot generate fields for untagged union {union_:?}"), |
| 349 | }; |
| 350 | |
| 351 | let arms = fields.into_iter().map(|(name, fields)| { |
| 352 | let method_field = fields.iter().enumerate().filter_map(|(n, field)| { |
| 353 | if attr_skip(&field.attrs) { |
| 354 | None |
| 355 | } else { |
| 356 | let name = field_ident(n, field); |
| 357 | Some(quote! { #name.#method() }) |
| 358 | } |
| 359 | }); |
| 360 | |
| 361 | let field_bindings = fields |
| 362 | .iter() |
| 363 | .enumerate() |
| 364 | .map(|(n, field)| field_ident(n, field)); |
| 365 | |
| 366 | let binding = match fields { |
| 367 | Fields::Named(_) => quote! { |
| 368 | #name { #(#field_bindings),* } |
| 369 | }, |
| 370 | Fields::Unnamed(_) => quote! { |
| 371 | #name ( #(#field_bindings),* ) |
| 372 | }, |
| 373 | Fields::Unit => quote! { |
| 374 | #name |
| 375 | }, |
| 376 | }; |
| 377 | |
| 378 | quote! { |
| 379 | #[allow(unused_variables, unused_assignments)] |
| 380 | #binding => { |
| 381 | #(#method_field);* |
| 382 | } |
| 383 | } |
| 384 | }); |
| 385 |
no test coverage detected