From 634f93c9854d3372f643d7b7fd20304482bbe1a7 Mon Sep 17 00:00:00 2001 From: Jonas Platte Date: Fri, 1 Apr 2022 16:23:57 +0200 Subject: [PATCH] macros: Improve error handling --- crates/ruma-macros/src/events/event.rs | 18 ++--- .../ruma-macros/src/events/event_content.rs | 2 +- crates/ruma-macros/src/events/event_enum.rs | 72 +++++++++---------- crates/ruma-macros/src/events/event_parse.rs | 23 +++--- 4 files changed, 58 insertions(+), 57 deletions(-) diff --git a/crates/ruma-macros/src/events/event.rs b/crates/ruma-macros/src/events/event.rs index 4842e32a..ba422bdb 100644 --- a/crates/ruma-macros/src/events/event.rs +++ b/crates/ruma-macros/src/events/event.rs @@ -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 { + 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 { 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 { diff --git a/crates/ruma-macros/src/events/event_content.rs b/crates/ruma-macros/src/events/event_content.rs index 0df9b62d..6c72dc8f 100644 --- a/crates/ruma-macros/src/events/event_content.rs +++ b/crates/ruma-macros/src/events/event_content.rs @@ -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); diff --git a/crates/ruma-macros/src/events/event_enum.rs b/crates/ruma-macros/src/events/event_enum.rs index 69cf8119..501f34f3 100644 --- a/crates/ruma-macros/src/events/event_enum.rs +++ b/crates/ruma-macros/src/events/event_enum.rs @@ -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 { + 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 { 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(deserializer: D) -> Result 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 { + 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 { + 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 { + 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 { 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 { + 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( diff --git a/crates/ruma-macros/src/events/event_parse.rs b/crates/ruma-macros/src/events/event_parse.rs index 72185d69..46e504c6 100644 --- a/crates/ruma-macros/src/events/event_parse.rs +++ b/crates/ruma-macros/src/events/event_parse.rs @@ -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 { + pub fn to_event_ident(self, var: EventKindVariation) -> syn::Result { 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 { + Ok(format_ident!("Any{}", self.to_event_ident(var)?)) } pub fn to_event_type_enum(self) -> Ident {