MCPcopy Create free account
hub / github.com/RustCrypto/utils / generate_fields

Function generate_fields

zeroize_derive/src/lib.rs:328–392  ·  view source on GitHub ↗
(input: &DeriveInput, method: TokenStream)

Source from the content-addressed store, hash-verified

326}
327
328fn 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

Callers 2

derive_zeroize_implFunction · 0.85

Calls 4

attr_skipFunction · 0.85
field_identFunction · 0.85
mapMethod · 0.80
into_iterMethod · 0.80

Tested by

no test coverage detected