events: Refactor marker trait code generation

This commit is contained in:
Jonas Platte 2021-05-15 15:18:22 +02:00
parent ab850d8237
commit ed9138796a
No known key found for this signature in database
GPG Key ID: 7D261D771D915378
2 changed files with 34 additions and 60 deletions

View File

@ -289,39 +289,26 @@ fn generate_event_content_derives(
) -> syn::Result<TokenStream> { ) -> syn::Result<TokenStream> {
let msg = "valid event kinds are GlobalAccountData, RoomAccountData, \ let msg = "valid event kinds are GlobalAccountData, RoomAccountData, \
EphemeralRoom, Message, State, ToDevice"; EphemeralRoom, Message, State, ToDevice";
content_attr let marker_traits: Vec<_> = content_attr
.iter() .iter()
.map(|kind| { .map(|kind| match kind {
Ok(match kind { EventKind::GlobalAccountData => Ok(quote! { GlobalAccountDataEventContent }),
EventKind::GlobalAccountData => quote! { EventKind::RoomAccountData => Ok(quote! { RoomAccountDataEventContent }),
#[automatically_derived] EventKind::Ephemeral => Ok(quote! { EphemeralRoomEventContent }),
impl #ruma_events::GlobalAccountDataEventContent for #ident {} EventKind::Message => Ok(quote! { MessageEventContent }),
}, EventKind::State => Ok(quote! { StateEventContent }),
EventKind::RoomAccountData => quote! { EventKind::ToDevice => Ok(quote! { ToDeviceEventContent }),
#[automatically_derived] EventKind::Redaction => Err(syn::Error::new_spanned(ident, msg)),
impl #ruma_events::RoomAccountDataEventContent for #ident {} EventKind::Presence => Err(syn::Error::new_spanned(ident, msg)),
},
EventKind::Ephemeral => quote! {
#[automatically_derived]
impl #ruma_events::EphemeralRoomEventContent for #ident {}
},
EventKind::Message => quote! {
#[automatically_derived]
impl #ruma_events::MessageEventContent for #ident {}
},
EventKind::State => quote! {
#[automatically_derived]
impl #ruma_events::StateEventContent for #ident {}
},
EventKind::ToDevice => quote! {
#[automatically_derived]
impl #ruma_events::ToDeviceEventContent for #ident {}
},
EventKind::Redaction => return Err(syn::Error::new_spanned(ident, msg)),
EventKind::Presence => return Err(syn::Error::new_spanned(ident, msg)),
}) })
.collect::<syn::Result<_>>()?;
Ok(quote! {
#(
#[automatically_derived]
impl #ruma_events::#marker_traits for #ident {}
)*
}) })
.collect()
} }
fn generate_event_content_impl( fn generate_event_content_impl(

View File

@ -430,7 +430,7 @@ fn expand_content_enum(
} }
}; };
let marker_trait_impls = marker_traits(kind, ruma_events); let marker_trait_impl = marker_trait(kind, ruma_events);
let redacted_content_enum = if kind.is_state() || kind.is_message() { let redacted_content_enum = if kind.is_state() || kind.is_message() {
let redacted_ident = kind.to_redacted_content_enum(); let redacted_ident = kind.to_redacted_content_enum();
@ -488,7 +488,7 @@ fn expand_content_enum(
#event_content_impl #event_content_impl
#marker_trait_impls #marker_trait_impl
#redacted_content_enum #redacted_content_enum
} }
@ -708,34 +708,21 @@ fn generate_custom_variant(
} }
} }
fn marker_traits(kind: &EventKind, ruma_events: &TokenStream) -> TokenStream { fn marker_trait(kind: &EventKind, ruma_events: &TokenStream) -> TokenStream {
let marker_trait = match kind {
EventKind::State => quote! { StateEventContent },
EventKind::Message => quote! { MessageEventContent },
EventKind::Ephemeral => quote! { EphemeralRoomEventContent },
EventKind::GlobalAccountData => quote! { GlobalAccountDataEventContent },
EventKind::RoomAccountData => quote! { RoomAccountDataEventContent },
EventKind::ToDevice => quote! { ToDeviceEventContent },
_ => return TokenStream::new(),
};
let ident = kind.to_content_enum(); let ident = kind.to_content_enum();
match kind { quote! {
EventKind::State => quote! {
#[automatically_derived] #[automatically_derived]
impl #ruma_events::StateEventContent for #ident {} impl #ruma_events::#marker_trait for #ident {}
},
EventKind::Message => quote! {
#[automatically_derived]
impl #ruma_events::MessageEventContent for #ident {}
},
EventKind::Ephemeral => quote! {
#[automatically_derived]
impl #ruma_events::EphemeralRoomEventContent for #ident {}
},
EventKind::GlobalAccountData => quote! {
#[automatically_derived]
impl #ruma_events::GlobalAccountDataEventContent for #ident {}
},
EventKind::RoomAccountData => quote! {
#[automatically_derived]
impl #ruma_events::RoomAccountDataEventContent for #ident {}
},
EventKind::ToDevice => quote! {
#[automatically_derived]
impl #ruma_events::ToDeviceEventContent for #ident {}
},
_ => TokenStream::new(),
} }
} }