Move event content derives into one place and share code

This commit is contained in:
Ragotzy.devin 2020-05-26 04:33:16 -04:00 committed by Jonas Platte
parent cc3d0af40c
commit 0c0dafa2c5
No known key found for this signature in database
GPG Key ID: 7D261D771D915378
2 changed files with 42 additions and 6 deletions

View File

@ -1,4 +1,4 @@
//! Implementation of the `StateEventContent` derive macro //! Implementations of the MessageEventContent and StateEventContent derive macro.
use proc_macro2::{Span, TokenStream}; use proc_macro2::{Span, TokenStream};
use quote::quote; use quote::quote;
@ -11,7 +11,7 @@ use syn::{
/// ///
/// `#[ruma_event(type = "m.room.alias")]` /// `#[ruma_event(type = "m.room.alias")]`
enum EventMeta { enum EventMeta {
/// Variant holds the "m.room.whatever" event type. /// Variant holds the "m.whatever" event type.
Type(LitStr), Type(LitStr),
} }
@ -23,8 +23,10 @@ impl Parse for EventMeta {
} }
} }
/// Create a `StateEventContent` implementation for a struct /// Create a `RoomEventContent` implementation for a struct.
pub fn expand_state_event(input: DeriveInput) -> syn::Result<TokenStream> { ///
/// This is used internally for code sharing as `RoomEventContent` is not derivable.
fn expand_room_event(input: DeriveInput) -> syn::Result<TokenStream> {
let ident = &input.ident; let ident = &input.ident;
let event_type_attr = input let event_type_attr = input
@ -72,6 +74,28 @@ pub fn expand_state_event(input: DeriveInput) -> syn::Result<TokenStream> {
#event_content_impl #event_content_impl
impl ::ruma_events::RoomEventContent for #ident { } impl ::ruma_events::RoomEventContent for #ident { }
})
}
/// Create a `MessageEventContent` implementation for a struct
pub fn expand_message_event(input: DeriveInput) -> syn::Result<TokenStream> {
let ident = input.ident.clone();
let room_ev_content = expand_room_event(input)?;
Ok(quote! {
#room_ev_content
impl ::ruma_events::MessageEventContent for #ident { }
})
}
/// Create a `MessageEventContent` implementation for a struct
pub fn expand_state_event(input: DeriveInput) -> syn::Result<TokenStream> {
let ident = input.ident.clone();
let room_ev_content = expand_room_event(input)?;
Ok(quote! {
#room_ev_content
impl ::ruma_events::StateEventContent for #ident { } impl ::ruma_events::StateEventContent for #ident { }
}) })

View File

@ -37,13 +37,16 @@ use quote::ToTokens;
use syn::{parse_macro_input, DeriveInput}; use syn::{parse_macro_input, DeriveInput};
use self::{ use self::{
from_raw::expand_from_raw, gen::RumaEvent, parse::RumaEventInput, state::expand_state_event, event_content::{expand_message_event, expand_state_event},
from_raw::expand_from_raw,
gen::RumaEvent,
parse::RumaEventInput,
}; };
mod event_content;
mod from_raw; mod from_raw;
mod gen; mod gen;
mod parse; mod parse;
mod state;
// A note about the `example` modules that appears in doctests: // A note about the `example` modules that appears in doctests:
// //
@ -149,6 +152,15 @@ pub fn derive_from_raw(input: TokenStream) -> TokenStream {
.into() .into()
} }
/// Generates an implementation of `ruma_events::MessageEventContent` and it's super traits.
#[proc_macro_derive(MessageEventContent, attributes(ruma_event))]
pub fn derive_message_event_content(input: TokenStream) -> TokenStream {
let input = parse_macro_input!(input as DeriveInput);
expand_message_event(input)
.unwrap_or_else(|err| err.to_compile_error())
.into()
}
/// Generates an implementation of `ruma_events::StateEventContent` and it's super traits. /// Generates an implementation of `ruma_events::StateEventContent` and it's super traits.
#[proc_macro_derive(StateEventContent, attributes(ruma_event))] #[proc_macro_derive(StateEventContent, attributes(ruma_event))]
pub fn derive_state_event_content(input: TokenStream) -> TokenStream { pub fn derive_state_event_content(input: TokenStream) -> TokenStream {