macros: Improve error handling
This commit is contained in:
		
							parent
							
								
									a50b2d313a
								
							
						
					
					
						commit
						634f93c985
					
				| @ -364,14 +364,14 @@ fn expand_redact_event( | ||||
|     var: EventKindVariation, | ||||
|     fields: &[Field], | ||||
|     ruma_common: &TokenStream, | ||||
| ) -> TokenStream { | ||||
|     let redacted_type = kind.to_event_ident(var.to_redacted()); | ||||
| ) -> syn::Result<TokenStream> { | ||||
|     let redacted_type = kind.to_event_ident(var.to_redacted())?; | ||||
|     let redacted_event_type_enum = kind.to_event_type_enum(); | ||||
|     let ident = &input.ident; | ||||
| 
 | ||||
|     let mut generics = input.generics.clone(); | ||||
|     if generics.params.is_empty() { | ||||
|         return TokenStream::new(); | ||||
|         return Ok(TokenStream::new()); | ||||
|     } | ||||
| 
 | ||||
|     assert_eq!(generics.params.len(), 1, "expected one generic parameter"); | ||||
| @ -410,7 +410,7 @@ fn expand_redact_event( | ||||
|         } | ||||
|     }); | ||||
| 
 | ||||
|     quote! { | ||||
|     Ok(quote! { | ||||
|         #[automatically_derived] | ||||
|         impl #impl_generics #ruma_common::events::Redact for #ident #ty_gen #where_clause { | ||||
|             type Redacted = #ruma_common::events::#redacted_type< | ||||
| @ -429,7 +429,7 @@ fn expand_redact_event( | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|     }) | ||||
| } | ||||
| 
 | ||||
| fn expand_sync_from_into_full( | ||||
| @ -438,13 +438,13 @@ fn expand_sync_from_into_full( | ||||
|     var: EventKindVariation, | ||||
|     fields: &[Field], | ||||
|     ruma_common: &TokenStream, | ||||
| ) -> TokenStream { | ||||
| ) -> syn::Result<TokenStream> { | ||||
|     let ident = &input.ident; | ||||
|     let full_struct = kind.to_event_ident(var.to_full()); | ||||
|     let full_struct = kind.to_event_ident(var.to_full())?; | ||||
|     let (impl_generics, ty_gen, where_clause) = input.generics.split_for_impl(); | ||||
|     let fields: Vec<_> = fields.iter().flat_map(|f| &f.ident).collect(); | ||||
| 
 | ||||
|     quote! { | ||||
|     Ok(quote! { | ||||
|         #[automatically_derived] | ||||
|         impl #impl_generics ::std::convert::From<#full_struct #ty_gen> | ||||
|             for #ident #ty_gen #where_clause | ||||
| @ -469,7 +469,7 @@ fn expand_sync_from_into_full( | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|     }) | ||||
| } | ||||
| 
 | ||||
| fn expand_eq_ord_event(input: &DeriveInput) -> TokenStream { | ||||
|  | ||||
| @ -379,7 +379,7 @@ fn generate_event_type_aliases( | ||||
|         EventKindVariation::RedactedSync, | ||||
|     ] | ||||
|     .iter() | ||||
|     .filter_map(|&var| Some((var, event_kind.try_to_event_ident(var)?))) | ||||
|     .filter_map(|&var| Some((var, event_kind.to_event_ident(var).ok()?))) | ||||
|     .map(|(var, ev_struct)| { | ||||
|         let ev_type = format_ident!("{}{}", var, ev_type_s); | ||||
| 
 | ||||
|  | ||||
| @ -83,9 +83,9 @@ fn expand_event_enum( | ||||
|     attrs: &[Attribute], | ||||
|     variants: &[EventEnumVariant], | ||||
|     ruma_common: &TokenStream, | ||||
| ) -> TokenStream { | ||||
|     let event_struct = kind.to_event_ident(var); | ||||
|     let ident = kind.to_event_enum_ident(var); | ||||
| ) -> syn::Result<TokenStream> { | ||||
|     let event_struct = kind.to_event_ident(var)?; | ||||
|     let ident = kind.to_event_enum_ident(var)?; | ||||
| 
 | ||||
|     let variant_decls = variants.iter().map(|v| v.decl()); | ||||
|     let content: Vec<_> = | ||||
| @ -93,11 +93,11 @@ fn expand_event_enum( | ||||
| 
 | ||||
|     let custom_ty = format_ident!("Custom{}Content", kind); | ||||
| 
 | ||||
|     let deserialize_impl = expand_deserialize_impl(kind, var, events, variants, ruma_common); | ||||
|     let field_accessor_impl = expand_accessor_methods(kind, var, variants, ruma_common); | ||||
|     let deserialize_impl = expand_deserialize_impl(kind, var, events, variants, ruma_common)?; | ||||
|     let field_accessor_impl = expand_accessor_methods(kind, var, variants, ruma_common)?; | ||||
|     let from_impl = expand_from_impl(&ident, &content, variants); | ||||
| 
 | ||||
|     quote! { | ||||
|     Ok(quote! { | ||||
|         #( #attrs )* | ||||
|         #[derive(Clone, Debug)] | ||||
|         #[allow(clippy::large_enum_variant)] | ||||
| @ -117,7 +117,7 @@ fn expand_event_enum( | ||||
|         #deserialize_impl | ||||
|         #field_accessor_impl | ||||
|         #from_impl | ||||
|     } | ||||
|     }) | ||||
| } | ||||
| 
 | ||||
| fn expand_deserialize_impl( | ||||
| @ -126,11 +126,11 @@ fn expand_deserialize_impl( | ||||
|     events: &[LitStr], | ||||
|     variants: &[EventEnumVariant], | ||||
|     ruma_common: &TokenStream, | ||||
| ) -> TokenStream { | ||||
| ) -> syn::Result<TokenStream> { | ||||
|     let serde = quote! { #ruma_common::exports::serde }; | ||||
|     let serde_json = quote! { #ruma_common::exports::serde_json }; | ||||
| 
 | ||||
|     let ident = kind.to_event_enum_ident(var); | ||||
|     let ident = kind.to_event_enum_ident(var)?; | ||||
| 
 | ||||
|     let variant_attrs = variants.iter().map(|v| { | ||||
|         let attrs = &v.attrs; | ||||
| @ -139,7 +139,7 @@ fn expand_deserialize_impl( | ||||
|     let self_variants = variants.iter().map(|v| v.ctor(quote! { Self })); | ||||
|     let content = events.iter().map(|event| to_event_path(event, kind, var, ruma_common)); | ||||
| 
 | ||||
|     quote! { | ||||
|     Ok(quote! { | ||||
|         impl<'de> #serde::de::Deserialize<'de> for #ident { | ||||
|             fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> | ||||
|             where | ||||
| @ -166,7 +166,7 @@ fn expand_deserialize_impl( | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|     }) | ||||
| } | ||||
| 
 | ||||
| fn expand_from_impl( | ||||
| @ -196,14 +196,14 @@ fn expand_from_full_event( | ||||
|     kind: EventKind, | ||||
|     var: EventKindVariation, | ||||
|     variants: &[EventEnumVariant], | ||||
| ) -> TokenStream { | ||||
|     let ident = kind.to_event_enum_ident(var); | ||||
|     let sync = kind.to_event_enum_ident(var.to_sync()); | ||||
| ) -> syn::Result<TokenStream> { | ||||
|     let ident = kind.to_event_enum_ident(var)?; | ||||
|     let sync = kind.to_event_enum_ident(var.to_sync())?; | ||||
| 
 | ||||
|     let ident_variants = variants.iter().map(|v| v.match_arm(&ident)); | ||||
|     let self_variants = variants.iter().map(|v| v.ctor(quote! { Self })); | ||||
| 
 | ||||
|     quote! { | ||||
|     Ok(quote! { | ||||
|         #[automatically_derived] | ||||
|         impl ::std::convert::From<#ident> for #sync { | ||||
|             fn from(event: #ident) -> Self { | ||||
| @ -219,7 +219,7 @@ fn expand_from_full_event( | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|     }) | ||||
| } | ||||
| 
 | ||||
| fn expand_into_full_event( | ||||
| @ -227,14 +227,14 @@ fn expand_into_full_event( | ||||
|     var: EventKindVariation, | ||||
|     variants: &[EventEnumVariant], | ||||
|     ruma_common: &TokenStream, | ||||
| ) -> TokenStream { | ||||
|     let ident = kind.to_event_enum_ident(var); | ||||
|     let full = kind.to_event_enum_ident(var.to_full()); | ||||
| ) -> syn::Result<TokenStream> { | ||||
|     let ident = kind.to_event_enum_ident(var)?; | ||||
|     let full = kind.to_event_enum_ident(var.to_full())?; | ||||
| 
 | ||||
|     let self_variants = variants.iter().map(|v| v.match_arm(quote! { Self })); | ||||
|     let full_variants = variants.iter().map(|v| v.ctor(&full)); | ||||
| 
 | ||||
|     quote! { | ||||
|     Ok(quote! { | ||||
|         #[automatically_derived] | ||||
|         impl #ident { | ||||
|             /// Convert this sync event into a full event (one with a `room_id` field).
 | ||||
| @ -254,7 +254,7 @@ fn expand_into_full_event( | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|     }) | ||||
| } | ||||
| 
 | ||||
| /// Create a content enum from `EventEnumInput`.
 | ||||
| @ -353,14 +353,14 @@ fn expand_redact( | ||||
|     var: EventKindVariation, | ||||
|     variants: &[EventEnumVariant], | ||||
|     ruma_common: &TokenStream, | ||||
| ) -> TokenStream { | ||||
|     let ident = kind.to_event_enum_ident(var); | ||||
|     let redacted_enum = kind.to_event_enum_ident(var.to_redacted()); | ||||
| ) -> syn::Result<TokenStream> { | ||||
|     let ident = kind.to_event_enum_ident(var)?; | ||||
|     let redacted_enum = kind.to_event_enum_ident(var.to_redacted())?; | ||||
| 
 | ||||
|     let self_variants = variants.iter().map(|v| v.match_arm(quote! { Self })); | ||||
|     let redacted_variants = variants.iter().map(|v| v.ctor(&redacted_enum)); | ||||
| 
 | ||||
|     quote! { | ||||
|     Ok(quote! { | ||||
|         #[automatically_derived] | ||||
|         impl #ruma_common::events::Redact for #ident { | ||||
|             type Redacted = #redacted_enum; | ||||
| @ -382,22 +382,22 @@ fn expand_redact( | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|     }) | ||||
| } | ||||
| 
 | ||||
| fn expand_possibly_redacted_enum( | ||||
|     kind: EventKind, | ||||
|     var: EventKindVariation, | ||||
|     ruma_common: &TokenStream, | ||||
| ) -> TokenStream { | ||||
| ) -> syn::Result<TokenStream> { | ||||
|     let serde = quote! { #ruma_common::exports::serde }; | ||||
|     let serde_json = quote! { #ruma_common::exports::serde_json }; | ||||
| 
 | ||||
|     let ident = format_ident!("AnyPossiblyRedacted{}", kind.to_event_ident(var)); | ||||
|     let regular_enum_ident = kind.to_event_enum_ident(var); | ||||
|     let redacted_enum_ident = kind.to_event_enum_ident(var.to_redacted()); | ||||
|     let ident = format_ident!("AnyPossiblyRedacted{}", kind.to_event_ident(var)?); | ||||
|     let regular_enum_ident = kind.to_event_enum_ident(var)?; | ||||
|     let redacted_enum_ident = kind.to_event_enum_ident(var.to_redacted())?; | ||||
| 
 | ||||
|     quote! { | ||||
|     Ok(quote! { | ||||
|         /// An enum that holds either regular un-redacted events or redacted events.
 | ||||
|         #[derive(Clone, Debug)] | ||||
|         #[allow(clippy::exhaustive_enums)] | ||||
| @ -426,7 +426,7 @@ fn expand_possibly_redacted_enum( | ||||
|                 }) | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|     }) | ||||
| } | ||||
| 
 | ||||
| fn expand_accessor_methods( | ||||
| @ -434,8 +434,8 @@ fn expand_accessor_methods( | ||||
|     var: EventKindVariation, | ||||
|     variants: &[EventEnumVariant], | ||||
|     ruma_common: &TokenStream, | ||||
| ) -> TokenStream { | ||||
|     let ident = kind.to_event_enum_ident(var); | ||||
| ) -> syn::Result<TokenStream> { | ||||
|     let ident = kind.to_event_enum_ident(var)?; | ||||
|     let event_type_enum = format_ident!("{}Type", kind); | ||||
|     let self_variants: Vec<_> = variants.iter().map(|v| v.match_arm(quote! { Self })).collect(); | ||||
| 
 | ||||
| @ -526,7 +526,7 @@ fn expand_accessor_methods( | ||||
|         }) | ||||
|     }); | ||||
| 
 | ||||
|     quote! { | ||||
|     Ok(quote! { | ||||
|         #[automatically_derived] | ||||
|         impl #ident { | ||||
|             /// Returns the `type` of this event.
 | ||||
| @ -544,7 +544,7 @@ fn expand_accessor_methods( | ||||
| 
 | ||||
|             #( #methods )* | ||||
|         } | ||||
|     } | ||||
|     }) | ||||
| } | ||||
| 
 | ||||
| fn to_event_path( | ||||
|  | ||||
| @ -2,6 +2,7 @@ | ||||
| 
 | ||||
| use std::fmt; | ||||
| 
 | ||||
| use proc_macro2::Span; | ||||
| use quote::{format_ident, IdentFragment}; | ||||
| use syn::{ | ||||
|     braced, | ||||
| @ -122,7 +123,7 @@ impl EventKind { | ||||
|         matches!(self, Self::GlobalAccountData | Self::RoomAccountData) | ||||
|     } | ||||
| 
 | ||||
|     pub fn try_to_event_ident(self, var: EventKindVariation) -> Option<Ident> { | ||||
|     pub fn to_event_ident(self, var: EventKindVariation) -> syn::Result<Ident> { | ||||
|         use EventKindVariation as V; | ||||
| 
 | ||||
|         match (self, var) { | ||||
| @ -132,19 +133,19 @@ impl EventKind { | ||||
|                 Self::MessageLike | Self::RoomRedaction | Self::State, | ||||
|                 V::Redacted | V::RedactedSync, | ||||
|             ) | ||||
|             | (Self::State, V::Stripped | V::Initial) => Some(format_ident!("{}{}", var, self)), | ||||
|             _ => None, | ||||
|             | (Self::State, V::Stripped | V::Initial) => Ok(format_ident!("{}{}", var, self)), | ||||
|             _ => Err(syn::Error::new( | ||||
|                 Span::call_site(), | ||||
|                 format!( | ||||
|                     "({:?}, {:?}) is not a valid event kind / variation combination", | ||||
|                     self, var | ||||
|                 ), | ||||
|             )), | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     pub fn to_event_ident(self, var: EventKindVariation) -> Ident { | ||||
|         self.try_to_event_ident(var).unwrap_or_else(|| { | ||||
|             panic!("({:?}, {:?}) is not a valid event kind / variation combination", self, var); | ||||
|         }) | ||||
|     } | ||||
| 
 | ||||
|     pub fn to_event_enum_ident(self, var: EventKindVariation) -> Ident { | ||||
|         format_ident!("Any{}", self.to_event_ident(var)) | ||||
|     pub fn to_event_enum_ident(self, var: EventKindVariation) -> syn::Result<Ident> { | ||||
|         Ok(format_ident!("Any{}", self.to_event_ident(var)?)) | ||||
|     } | ||||
| 
 | ||||
|     pub fn to_event_type_enum(self) -> Ident { | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user