macros: Improve error handling

This commit is contained in:
Jonas Platte 2022-04-01 16:23:57 +02:00 committed by Jonas Platte
parent a50b2d313a
commit 634f93c985
4 changed files with 58 additions and 57 deletions

View File

@ -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 {

View File

@ -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);

View File

@ -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(

View File

@ -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 {