macros: Ensure event content types are structs
This commit is contained in:
		
							parent
							
								
									0b10151bcb
								
							
						
					
					
						commit
						d78fb70953
					
				| @ -145,19 +145,31 @@ pub fn expand_event_content( | |||||||
|         } |         } | ||||||
|     }; |     }; | ||||||
| 
 | 
 | ||||||
|  |     let ident = &input.ident; | ||||||
|  |     let fields = match &input.data { | ||||||
|  |         syn::Data::Struct(syn::DataStruct { fields, .. }) => fields, | ||||||
|  |         _ => { | ||||||
|  |             return Err(syn::Error::new( | ||||||
|  |                 Span::call_site(), | ||||||
|  |                 "event content types need to be structs", | ||||||
|  |             )); | ||||||
|  |         } | ||||||
|  |     }; | ||||||
|  | 
 | ||||||
|     // We only generate redacted content structs for state and message-like events
 |     // We only generate redacted content structs for state and message-like events
 | ||||||
|     let redacted_event_content = needs_redacted(&content_attr, event_kind) |     let redacted_event_content = needs_redacted(&content_attr, event_kind) | ||||||
|         .then(|| generate_redacted_event_content(input, event_type, ruma_common, event_kind)) |         .then(|| { | ||||||
|  |             generate_redacted_event_content(ident, fields, event_type, ruma_common, event_kind) | ||||||
|  |         }) | ||||||
|         .transpose()?; |         .transpose()?; | ||||||
| 
 | 
 | ||||||
|     let event_content_impl = generate_event_content_impl(&input.ident, event_type, ruma_common); |     let event_content_impl = generate_event_content_impl(ident, event_type, ruma_common); | ||||||
|     let static_event_content_impl = event_kind.map(|k| { |     let static_event_content_impl = event_kind | ||||||
|         generate_static_event_content_impl(&input.ident, k, false, event_type, ruma_common) |         .map(|k| generate_static_event_content_impl(ident, k, false, event_type, ruma_common)); | ||||||
|     }); |  | ||||||
|     let marker_trait_impl = |     let marker_trait_impl = | ||||||
|         event_kind.map(|k| generate_marker_trait_impl(k, &input.ident, ruma_common)).transpose()?; |         event_kind.map(|k| generate_marker_trait_impl(k, ident, ruma_common)).transpose()?; | ||||||
|     let type_aliases = event_kind |     let type_aliases = event_kind | ||||||
|         .map(|k| generate_event_type_aliases(k, &input.ident, &event_type.value(), ruma_common)) |         .map(|k| generate_event_type_aliases(k, ident, &event_type.value(), ruma_common)) | ||||||
|         .transpose()?; |         .transpose()?; | ||||||
| 
 | 
 | ||||||
|     Ok(quote! { |     Ok(quote! { | ||||||
| @ -170,7 +182,8 @@ pub fn expand_event_content( | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| fn generate_redacted_event_content( | fn generate_redacted_event_content( | ||||||
|     input: &DeriveInput, |     ident: &Ident, | ||||||
|  |     fields: &syn::Fields, | ||||||
|     event_type: &LitStr, |     event_type: &LitStr, | ||||||
|     ruma_common: &TokenStream, |     ruma_common: &TokenStream, | ||||||
|     event_kind: Option<EventKind>, |     event_kind: Option<EventKind>, | ||||||
| @ -178,44 +191,39 @@ fn generate_redacted_event_content( | |||||||
|     let serde = quote! { #ruma_common::exports::serde }; |     let serde = quote! { #ruma_common::exports::serde }; | ||||||
|     let serde_json = quote! { #ruma_common::exports::serde_json }; |     let serde_json = quote! { #ruma_common::exports::serde_json }; | ||||||
| 
 | 
 | ||||||
|     let ident = &input.ident; |  | ||||||
|     let doc = format!("Redacted form of [`{}`]", ident); |     let doc = format!("Redacted form of [`{}`]", ident); | ||||||
|     let redacted_ident = format_ident!("Redacted{}", ident); |     let redacted_ident = format_ident!("Redacted{}", ident); | ||||||
| 
 | 
 | ||||||
|     let kept_redacted_fields: Vec<syn::Field> = if let syn::Data::Struct(st) = &input.data { |     let kept_redacted_fields: Vec<_> = fields | ||||||
|         st.fields |         .iter() | ||||||
|             .iter() |         .map(|f| { | ||||||
|             .map(|f| { |             let mut keep_field = false; | ||||||
|                 let mut keep_field = false; |             let attrs = f | ||||||
|                 let attrs = f |                 .attrs | ||||||
|                     .attrs |                 .iter() | ||||||
|                     .iter() |                 .map(|a| -> syn::Result<_> { | ||||||
|                     .map(|a| -> syn::Result<_> { |                     if a.path.is_ident("ruma_event") { | ||||||
|                         if a.path.is_ident("ruma_event") { |                         if let EventMeta::SkipRedaction = a.parse_args()? { | ||||||
|                             if let EventMeta::SkipRedaction = a.parse_args()? { |                             keep_field = true; | ||||||
|                                 keep_field = true; |  | ||||||
|                             } |  | ||||||
| 
 |  | ||||||
|                             // don't re-emit our `ruma_event` attributes
 |  | ||||||
|                             Ok(None) |  | ||||||
|                         } else { |  | ||||||
|                             Ok(Some(a.clone())) |  | ||||||
|                         } |                         } | ||||||
|                     }) |  | ||||||
|                     .filter_map(Result::transpose) |  | ||||||
|                     .collect::<syn::Result<_>>()?; |  | ||||||
| 
 | 
 | ||||||
|                 if keep_field { |                         // don't re-emit our `ruma_event` attributes
 | ||||||
|                     Ok(Some(syn::Field { attrs, ..f.clone() })) |                         Ok(None) | ||||||
|                 } else { |                     } else { | ||||||
|                     Ok(None) |                         Ok(Some(a.clone())) | ||||||
|                 } |                     } | ||||||
|             }) |                 }) | ||||||
|             .filter_map(Result::transpose) |                 .filter_map(Result::transpose) | ||||||
|             .collect::<syn::Result<_>>()? |                 .collect::<syn::Result<_>>()?; | ||||||
|     } else { | 
 | ||||||
|         vec![] |             if keep_field { | ||||||
|     }; |                 Ok(Some(syn::Field { attrs, ..f.clone() })) | ||||||
|  |             } else { | ||||||
|  |                 Ok(None) | ||||||
|  |             } | ||||||
|  |         }) | ||||||
|  |         .filter_map(Result::transpose) | ||||||
|  |         .collect::<syn::Result<_>>()?; | ||||||
| 
 | 
 | ||||||
|     let redaction_struct_fields = kept_redacted_fields.iter().flat_map(|f| &f.ident); |     let redaction_struct_fields = kept_redacted_fields.iter().flat_map(|f| &f.ident); | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user