Move event content derives into one place and share code
This commit is contained in:
		
							parent
							
								
									cc3d0af40c
								
							
						
					
					
						commit
						0c0dafa2c5
					
				| @ -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 { } | ||||||
|     }) |     }) | ||||||
| @ -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 { | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user