From 5c0a91fae07beb6d1ab545670acf3d7fcdc1a7db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20Commaille?= <76261501+zecakeh@users.noreply.github.com> Date: Thu, 28 Apr 2022 10:37:27 +0200 Subject: [PATCH] events: Implement From for RoomEventType --- crates/ruma-macros/src/events/event_type.rs | 33 +++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/crates/ruma-macros/src/events/event_type.rs b/crates/ruma-macros/src/events/event_type.rs index 2a358c97..07d141b4 100644 --- a/crates/ruma-macros/src/events/event_type.rs +++ b/crates/ruma-macros/src/events/event_type.rs @@ -161,6 +161,37 @@ fn generate_enum( }) .collect::>()?; + let from_ident_for_room = if ident == "StateEventType" || ident == "MessageLikeEventType" { + let match_arms: Vec<_> = deduped + .iter() + .map(|e| { + let v = e.to_variant()?; + let ident_var = v.match_arm(quote! { #ident }); + let room_var = v.ctor(quote! { Self }); + + Ok(if e.has_type_fragment() { + quote! { #ident_var (_s) => #room_var (_s) } + } else { + quote! { #ident_var => #room_var } + }) + }) + .collect::>()?; + + Some(quote! { + #[allow(deprecated)] + impl ::std::convert::From<#ident> for RoomEventType { + fn from(s: #ident) -> Self { + match s { + #(#match_arms,)* + #ident ::_Custom(_s) => Self::_Custom(_s), + } + } + } + }) + } else { + None + }; + Ok(quote! { #[doc = #enum_doc] /// @@ -233,5 +264,7 @@ fn generate_enum( self.to_cow_str().serialize(serializer) } } + + #from_ident_for_room }) }