macros: Remove some unnecessary short-circuiting in event proc-macros

This commit is contained in:
Jonas Platte 2022-04-01 14:32:06 +02:00 committed by Jonas Platte
parent 634f93c985
commit 1415e32a1d
5 changed files with 118 additions and 52 deletions

View File

@ -45,7 +45,10 @@ pub fn expand_event(input: DeriveInput) -> syn::Result<TokenStream> {
let mut res = TokenStream::new(); let mut res = TokenStream::new();
res.extend(expand_serialize_event(&input, var, &fields, &ruma_common)); res.extend(expand_serialize_event(&input, var, &fields, &ruma_common));
res.extend(expand_deserialize_event(&input, kind, var, &fields, &ruma_common)?); res.extend(
expand_deserialize_event(&input, kind, var, &fields, &ruma_common)
.unwrap_or_else(syn::Error::into_compile_error),
);
if var.is_sync() { if var.is_sync() {
res.extend(expand_sync_from_into_full(&input, kind, var, &fields, &ruma_common)); res.extend(expand_sync_from_into_full(&input, kind, var, &fields, &ruma_common));

View File

@ -184,25 +184,20 @@ pub fn expand_event_content(
} }
// 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(|| {
.then(|| { generate_redacted_event_content(ident, fields.clone(), event_type, event_kind, ruma_common)
generate_redacted_event_content( .unwrap_or_else(syn::Error::into_compile_error)
ident, });
fields.clone(),
event_type,
event_kind,
ruma_common,
)
})
.transpose()?;
let event_content_impl = let event_content_impl =
generate_event_content_impl(ident, fields, event_type, event_kind, ruma_common)?; generate_event_content_impl(ident, fields, event_type, event_kind, ruma_common)
.unwrap_or_else(syn::Error::into_compile_error);
let static_event_content_impl = event_kind let static_event_content_impl = event_kind
.map(|k| generate_static_event_content_impl(ident, k, false, event_type, ruma_common)); .map(|k| generate_static_event_content_impl(ident, k, false, event_type, ruma_common));
let type_aliases = event_kind let type_aliases = event_kind.map(|k| {
.map(|k| generate_event_type_aliases(k, ident, &event_type.value(), ruma_common)) generate_event_type_aliases(k, ident, &event_type.value(), ruma_common)
.transpose()?; .unwrap_or_else(syn::Error::into_compile_error)
});
Ok(quote! { Ok(quote! {
#redacted_event_content #redacted_event_content
@ -301,7 +296,8 @@ fn generate_redacted_event_content<'a>(
event_type, event_type,
event_kind, event_kind,
ruma_common, ruma_common,
)?; )
.unwrap_or_else(syn::Error::into_compile_error);
let static_event_content_impl = event_kind.map(|k| { let static_event_content_impl = event_kind.map(|k| {
generate_static_event_content_impl(&redacted_ident, k, true, event_type, ruma_common) generate_static_event_content_impl(&redacted_ident, k, true, event_type, ruma_common)

View File

@ -48,29 +48,71 @@ pub fn expand_event_enums(input: &EventEnumDecl) -> syn::Result<TokenStream> {
let variants = &variants; let variants = &variants;
let ruma_common = &ruma_common; let ruma_common = &ruma_common;
res.extend(expand_event_enum(kind, V::Full, events, attrs, variants, ruma_common)); res.extend(
expand_event_enum(kind, V::Full, events, attrs, variants, ruma_common)
.unwrap_or_else(syn::Error::into_compile_error),
);
res.extend(expand_content_enum(kind, events, attrs, variants, ruma_common)); res.extend(expand_content_enum(kind, events, attrs, variants, ruma_common));
if matches!(kind, EventKind::Ephemeral | EventKind::MessageLike | EventKind::State) { if matches!(kind, EventKind::Ephemeral | EventKind::MessageLike | EventKind::State) {
res.extend(expand_event_enum(kind, V::Sync, events, attrs, variants, ruma_common)); res.extend(
res.extend(expand_from_full_event(kind, V::Full, variants)); expand_event_enum(kind, V::Sync, events, attrs, variants, ruma_common)
res.extend(expand_into_full_event(kind, V::Sync, variants, ruma_common)); .unwrap_or_else(syn::Error::into_compile_error),
);
res.extend(
expand_from_full_event(kind, V::Full, variants)
.unwrap_or_else(syn::Error::into_compile_error),
);
res.extend(
expand_into_full_event(kind, V::Sync, variants, ruma_common)
.unwrap_or_else(syn::Error::into_compile_error),
);
} }
if matches!(kind, EventKind::State) { if matches!(kind, EventKind::State) {
res.extend(expand_event_enum(kind, V::Stripped, events, attrs, variants, ruma_common)); res.extend(
res.extend(expand_event_enum(kind, V::Initial, events, attrs, variants, ruma_common)); expand_event_enum(kind, V::Stripped, events, attrs, variants, ruma_common)
.unwrap_or_else(syn::Error::into_compile_error),
);
res.extend(
expand_event_enum(kind, V::Initial, events, attrs, variants, ruma_common)
.unwrap_or_else(syn::Error::into_compile_error),
);
} }
if matches!(kind, EventKind::MessageLike | EventKind::State) { if matches!(kind, EventKind::MessageLike | EventKind::State) {
res.extend(expand_event_enum(kind, V::Redacted, events, attrs, variants, ruma_common)); res.extend(
res.extend(expand_event_enum(kind, V::RedactedSync, events, attrs, variants, ruma_common)); expand_event_enum(kind, V::Redacted, events, attrs, variants, ruma_common)
res.extend(expand_redact(kind, V::Full, variants, ruma_common)); .unwrap_or_else(syn::Error::into_compile_error),
res.extend(expand_redact(kind, V::Sync, variants, ruma_common)); );
res.extend(expand_possibly_redacted_enum(kind, V::Full, ruma_common)); res.extend(
res.extend(expand_possibly_redacted_enum(kind, V::Sync, ruma_common)); expand_event_enum(kind, V::RedactedSync, events, attrs, variants, ruma_common)
res.extend(expand_from_full_event(kind, V::Redacted, variants)); .unwrap_or_else(syn::Error::into_compile_error),
res.extend(expand_into_full_event(kind, V::RedactedSync, variants, ruma_common)); );
res.extend(
expand_redact(kind, V::Full, variants, ruma_common)
.unwrap_or_else(syn::Error::into_compile_error),
);
res.extend(
expand_redact(kind, V::Sync, variants, ruma_common)
.unwrap_or_else(syn::Error::into_compile_error),
);
res.extend(
expand_possibly_redacted_enum(kind, V::Full, ruma_common)
.unwrap_or_else(syn::Error::into_compile_error),
);
res.extend(
expand_possibly_redacted_enum(kind, V::Sync, ruma_common)
.unwrap_or_else(syn::Error::into_compile_error),
);
res.extend(
expand_from_full_event(kind, V::Redacted, variants)
.unwrap_or_else(syn::Error::into_compile_error),
);
res.extend(
expand_into_full_event(kind, V::RedactedSync, variants, ruma_common)
.unwrap_or_else(syn::Error::into_compile_error),
);
} }
Ok(res) Ok(res)

View File

@ -44,14 +44,38 @@ pub fn expand_event_type_enum(
let mut res = TokenStream::new(); let mut res = TokenStream::new();
res.extend(generate_enum("EventType", &all, &ruma_common)?); res.extend(
res.extend(generate_enum("RoomEventType", &room, &ruma_common)?); generate_enum("EventType", &all, &ruma_common)
res.extend(generate_enum("StateEventType", &state, &ruma_common)?); .unwrap_or_else(syn::Error::into_compile_error),
res.extend(generate_enum("MessageLikeEventType", &message, &ruma_common)?); );
res.extend(generate_enum("EphemeralRoomEventType", &ephemeral, &ruma_common)?); res.extend(
res.extend(generate_enum("RoomAccountDataEventType", &room_account, &ruma_common)?); generate_enum("RoomEventType", &room, &ruma_common)
res.extend(generate_enum("GlobalAccountDataEventType", &global_account, &ruma_common)?); .unwrap_or_else(syn::Error::into_compile_error),
res.extend(generate_enum("ToDeviceEventType", &to_device, &ruma_common)?); );
res.extend(
generate_enum("StateEventType", &state, &ruma_common)
.unwrap_or_else(syn::Error::into_compile_error),
);
res.extend(
generate_enum("MessageLikeEventType", &message, &ruma_common)
.unwrap_or_else(syn::Error::into_compile_error),
);
res.extend(
generate_enum("EphemeralRoomEventType", &ephemeral, &ruma_common)
.unwrap_or_else(syn::Error::into_compile_error),
);
res.extend(
generate_enum("RoomAccountDataEventType", &room_account, &ruma_common)
.unwrap_or_else(syn::Error::into_compile_error),
);
res.extend(
generate_enum("GlobalAccountDataEventType", &global_account, &ruma_common)
.unwrap_or_else(syn::Error::into_compile_error),
);
res.extend(
generate_enum("ToDeviceEventType", &to_device, &ruma_common)
.unwrap_or_else(syn::Error::into_compile_error),
);
Ok(res) Ok(res)
} }

View File

@ -72,24 +72,25 @@ use self::{
//// supported: https://github.com/rust-lang/rust/issues/74563 //// supported: https://github.com/rust-lang/rust/issues/74563
#[proc_macro] #[proc_macro]
pub fn event_enum(input: TokenStream) -> TokenStream { pub fn event_enum(input: TokenStream) -> TokenStream {
let event_enum_input = syn::parse_macro_input!(input as EventEnumInput);
let ruma_common = import_ruma_common(); let ruma_common = import_ruma_common();
let event_enum_input = syn::parse_macro_input!(input as EventEnumInput);
let enums = event_enum_input let enums = event_enum_input
.enums .enums
.iter() .iter()
.map(expand_event_enums) .map(|e| expand_event_enums(e).unwrap_or_else(syn::Error::into_compile_error))
.collect::<syn::Result<pm2::TokenStream>>(); .collect::<pm2::TokenStream>();
let event_types = expand_event_type_enum(event_enum_input, ruma_common);
event_types let event_types = expand_event_type_enum(event_enum_input, ruma_common)
.and_then(|types| { .unwrap_or_else(syn::Error::into_compile_error);
enums.map(|mut enums| {
enums.extend(types); let tokens = quote! {
enums #enums
}) #event_types
}) };
.unwrap_or_else(syn::Error::into_compile_error)
.into() tokens.into()
} }
/// Generates an implementation of `ruma_common::events::EventContent`. /// Generates an implementation of `ruma_common::events::EventContent`.