events: Use type aliases inside enums

This commit is contained in:
Jonas Platte 2021-10-01 19:49:25 +02:00
parent eff770d1d6
commit ab6a364e42
No known key found for this signature in database
GPG Key ID: 7D261D771D915378
2 changed files with 32 additions and 33 deletions

View File

@ -118,7 +118,7 @@ fn expand_any_with_deser(
let (event_struct, ident) = generate_event_idents(kind, var)?;
let content: Vec<_> =
events.iter().map(|event| to_event_path(event, &event_struct, ruma_events)).collect();
events.iter().map(|event| to_event_path(event, kind, var, ruma_events)).collect();
let variant_decls = variants.iter().map(|v| v.decl());
let self_variants = variants.iter().map(|v| v.ctor(quote! { Self }));
@ -831,13 +831,35 @@ fn redacted_accessor_methods(
})
}
fn to_event_path(name: &LitStr, struct_name: &Ident, ruma_events: &TokenStream) -> TokenStream {
fn to_event_path(
name: &LitStr,
kind: &EventKind,
var: &EventKindVariation,
ruma_events: &TokenStream,
) -> TokenStream {
let span = name.span();
let name = name.value();
// There is no need to give a good compiler error as `to_camel_case` is called first.
assert_eq!(&name[..2], "m.");
// Temporary hack
if *kind == EventKind::Message && name == "m.room.redaction" {
if *var == EventKindVariation::Redacted {
return quote! {
#ruma_events::RedactedMessageEvent<
#ruma_events::room::redaction::RedactedRedactionEventContent
>
};
} else if *var == EventKindVariation::RedactedSync {
return quote! {
#ruma_events::RedactedSyncMessageEvent<
#ruma_events::room::redaction::RedactedRedactionEventContent
>
};
}
}
let path: Vec<_> = name[2..].split('.').collect();
let event_str = path.last().unwrap();
@ -848,37 +870,14 @@ fn to_event_path(name: &LitStr, struct_name: &Ident, ruma_events: &TokenStream)
let path = path.iter().map(|s| Ident::new(s, span));
match struct_name.to_string().as_str() {
"MessageEvent" | "SyncMessageEvent" if name == "m.room.redaction" => {
let redaction = if struct_name == "MessageEvent" {
quote! { RedactionEvent }
let event_name = if *kind == EventKind::ToDevice {
assert_eq!(*var, EventKindVariation::Full);
format_ident!("ToDevice{}Event", event)
} else {
quote! { SyncRedactionEvent }
format_ident!("{}{}Event", var, event)
};
quote! { #ruma_events::room::redaction::#redaction }
}
"SyncStateEvent"
| "StrippedStateEvent"
| "InitialStateEvent"
| "SyncMessageEvent"
| "SyncEphemeralRoomEvent" => {
let content = format_ident!("{}EventContent", event);
quote! { #ruma_events::#struct_name<#ruma_events::#( #path )::*::#content> }
}
"ToDeviceEvent" => {
let content = format_ident!("ToDevice{}EventContent", event);
quote! { #ruma_events::#struct_name<#ruma_events::#( #path )::*::#content> }
}
struct_str if struct_str.contains("Redacted") => {
let content = format_ident!("Redacted{}EventContent", event);
quote! { #ruma_events::#struct_name<#ruma_events::#( #path )::*::#content> }
}
_ => {
let event_name = format_ident!("{}Event", event);
quote! { #ruma_events::#( #path )::*::#event_name }
}
}
}
fn to_event_content_path(
kind: &EventKind,

View File

@ -17,7 +17,7 @@ mod kw {
}
// If the variants of this enum change `to_event_path` needs to be updated as well.
#[derive(Clone, Copy, Eq, PartialEq)]
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum EventKindVariation {
Full,
Sync,