(input: &syn::DeriveInput)
| 14 | } |
| 15 | |
| 16 | pub(super) fn generate_struct(input: &syn::DeriveInput) -> proc_macro2::TokenStream { |
| 17 | let ident = &input.ident; |
| 18 | |
| 19 | let payload_ident = payload_ident(ident); |
| 20 | |
| 21 | // Collect only serde attributes to propagate to the payload |
| 22 | let attributes = input |
| 23 | .attrs |
| 24 | .iter() |
| 25 | .filter(|attr| attr.meta.path().is_ident("serde")) |
| 26 | .collect::<Vec<_>>(); |
| 27 | |
| 28 | let visibility = &input.vis; |
| 29 | |
| 30 | let fields = FieldInfo::collect(input); |
| 31 | |
| 32 | let mut payload_fields = vec![]; |
| 33 | let mut custom_serdes = vec![]; |
| 34 | |
| 35 | for field in fields.iter() { |
| 36 | let (payload_tokens, custom_serde) = map_payload_fields(field); |
| 37 | payload_fields.push(payload_tokens); |
| 38 | if let Some(custom_de) = custom_serde { |
| 39 | custom_serdes.push(custom_de); |
| 40 | } |
| 41 | } |
| 42 | |
| 43 | let (impl_generics, ty_generics, where_clause) = input.generics.split_for_impl(); |
| 44 | |
| 45 | let into_fields = fields |
| 46 | .iter() |
| 47 | .map(map_into_fields) |
| 48 | .collect::<Vec<proc_macro2::TokenStream>>(); |
| 49 | |
| 50 | let from_fields = fields |
| 51 | .iter() |
| 52 | .map(map_from_fields) |
| 53 | .collect::<Vec<proc_macro2::TokenStream>>(); |
| 54 | |
| 55 | let quoted = quote!( |
| 56 | #[derive(Debug, ::validify::Validate, serde::Deserialize)] |
| 57 | #(#attributes)* |
| 58 | #visibility struct #payload_ident #ty_generics #where_clause { |
| 59 | #(#payload_fields)* |
| 60 | } |
| 61 | |
| 62 | impl #impl_generics From<#ident> for #payload_ident { |
| 63 | fn from(original: #ident) -> Self { |
| 64 | Self { |
| 65 | #(#into_fields)* |
| 66 | } |
| 67 | } |
| 68 | } |
| 69 | |
| 70 | impl #impl_generics From<#payload_ident> for #ident { |
| 71 | fn from(payload: #payload_ident) -> Self { |
| 72 | Self { |
| 73 | #(#from_fields)* |
no test coverage detected