events-macros: Partial re-organize enum codegen
This commit is contained in:
parent
0a679816a9
commit
f699a52983
@ -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,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user