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