events-macros: Partial re-organize enum codegen

This commit is contained in:
Jonas Platte 2021-10-06 22:17:47 +02:00
parent 0a679816a9
commit f699a52983
No known key found for this signature in database
GPG Key ID: CC154DE0E30B7C67

View File

@ -48,30 +48,31 @@ pub fn expand_event_enums(input: &EventEnumDecl) -> syn::Result<TokenStream> {
let ruma_events = crate::import_ruma_events(); let ruma_events = crate::import_ruma_events();
let mut res = TokenStream::new();
let kind = input.kind; let kind = input.kind;
let attrs = &input.attrs; let attrs = &input.attrs;
let events: Vec<_> = input.events.iter().map(|entry| entry.ev_type.clone()).collect(); let events: Vec<_> = input.events.iter().map(|entry| entry.ev_type.clone()).collect();
let variants: Vec<_> = let variants: Vec<_> =
input.events.iter().map(EventEnumEntry::to_variant).collect::<syn::Result<_>>()?; input.events.iter().map(EventEnumEntry::to_variant).collect::<syn::Result<_>>()?;
let event_enum = expand_event_enum(kind, &events, attrs, &variants, V::Full, &ruma_events); res.extend(expand_event_enum(kind, &events, attrs, &variants, V::Full, &ruma_events));
let sync_event_enum = expand_event_enum(kind, &events, attrs, &variants, V::Sync, &ruma_events); res.extend(expand_content_enum(kind, &events, attrs, &variants, &ruma_events));
let stripped_event_enum =
expand_event_enum(kind, &events, attrs, &variants, V::Stripped, &ruma_events);
let initial_event_enum =
expand_event_enum(kind, &events, attrs, &variants, V::Initial, &ruma_events);
let redacted_event_enums =
expand_redacted_event_enum(kind, &events, attrs, &variants, &ruma_events);
let event_content_enum = expand_content_enum(kind, &events, attrs, &variants, &ruma_events);
Ok(quote! { if matches!(kind, EventKind::Ephemeral | EventKind::Message | EventKind::State) {
#event_enum res.extend(expand_event_enum(kind, &events, attrs, &variants, V::Sync, &ruma_events));
#sync_event_enum }
#stripped_event_enum
#initial_event_enum if matches!(kind, EventKind::State) {
#redacted_event_enums res.extend(expand_event_enum(kind, &events, attrs, &variants, V::Stripped, &ruma_events));
#event_content_enum res.extend(expand_event_enum(kind, &events, attrs, &variants, V::Initial, &ruma_events));
}) }
if matches!(kind, EventKind::Message | EventKind::State) {
res.extend(expand_redacted_event_enum(kind, &events, attrs, &variants, &ruma_events));
}
Ok(res)
} }
fn expand_event_enum( fn expand_event_enum(
@ -81,14 +82,12 @@ fn expand_event_enum(
variants: &[EventEnumVariant], variants: &[EventEnumVariant],
var: EventKindVariation, var: EventKindVariation,
ruma_events: &TokenStream, ruma_events: &TokenStream,
) -> Option<TokenStream> { ) -> TokenStream {
let serde = quote! { #ruma_events::exports::serde }; let serde = quote! { #ruma_events::exports::serde };
let serde_json = quote! { #ruma_events::exports::serde_json }; let serde_json = quote! { #ruma_events::exports::serde_json };
// If the event cannot be generated this bails out returning None which is rendered the same let event_struct = kind.to_event_ident(var).unwrap();
// as an empty `TokenStream`. This is effectively the check if the given input generates let ident = kind.to_event_enum_ident(var).unwrap();
// a valid event enum.
let (event_struct, ident) = generate_event_idents(kind, var)?;
let content: Vec<_> = let content: Vec<_> =
events.iter().map(|event| to_event_path(event, kind, var, ruma_events)).collect(); events.iter().map(|event| to_event_path(event, kind, var, ruma_events)).collect();
@ -151,7 +150,7 @@ fn expand_event_enum(
let redact_impl = expand_redact(&ident, kind, var, variants, ruma_events); let redact_impl = expand_redact(&ident, kind, var, variants, ruma_events);
let from_impl = expand_from_impl(ident, &content, variants); let from_impl = expand_from_impl(ident, &content, variants);
Some(quote! { quote! {
#event_enum #event_enum
#event_enum_to_from_sync #event_enum_to_from_sync
#field_accessor_impl #field_accessor_impl
@ -159,7 +158,7 @@ fn expand_event_enum(
#event_deserialize_impl #event_deserialize_impl
#redacted_enum #redacted_enum
#from_impl #from_impl
}) }
} }
fn expand_from_impl( fn expand_from_impl(
@ -263,17 +262,10 @@ fn expand_redacted_event_enum(
) -> TokenStream { ) -> TokenStream {
use EventKindVariation as V; use EventKindVariation as V;
if matches!(kind, EventKind::Message | EventKind::State) {
let full = expand_event_enum(kind, events, attrs, variants, V::Redacted, ruma_events); let full = expand_event_enum(kind, events, attrs, variants, V::Redacted, ruma_events);
let sync = expand_event_enum(kind, events, attrs, variants, V::RedactedSync, ruma_events); let sync = expand_event_enum(kind, events, attrs, variants, V::RedactedSync, ruma_events);
quote! { quote! { #full #sync }
#full
#sync
}
} else {
TokenStream::new()
}
} }
/// Create a content enum from `EventEnumInput`. /// Create a content enum from `EventEnumInput`.
@ -450,10 +442,6 @@ fn expand_redacted_enum(
} }
} }
fn generate_event_idents(kind: EventKind, var: EventKindVariation) -> Option<(Ident, Ident)> {
kind.to_event_ident(var).zip(kind.to_event_enum_ident(var))
}
fn generate_custom_variant( fn generate_custom_variant(
event_struct: &Ident, event_struct: &Ident,
var: EventKindVariation, var: EventKindVariation,