events-macros: Simplify conversion code generation
This commit is contained in:
parent
ab6a364e42
commit
8df746d442
@ -221,53 +221,23 @@ fn expand_conversion_impl(
|
|||||||
let ruma_identifiers = quote! { #ruma_events::exports::ruma_identifiers };
|
let ruma_identifiers = quote! { #ruma_events::exports::ruma_identifiers };
|
||||||
|
|
||||||
let ident = kind.to_event_enum_ident(var)?;
|
let ident = kind.to_event_enum_ident(var)?;
|
||||||
let variants: Vec<_> = variants
|
|
||||||
.iter()
|
|
||||||
.filter(|v| {
|
|
||||||
// We filter this variant out only for non redacted events.
|
|
||||||
// The type of the struct held in the enum variant is different in this case
|
|
||||||
// so we construct the variant manually.
|
|
||||||
!(v.ident == "RoomRedaction"
|
|
||||||
&& matches!(var, EventKindVariation::Full | EventKindVariation::Sync))
|
|
||||||
})
|
|
||||||
.collect();
|
|
||||||
|
|
||||||
match var {
|
match var {
|
||||||
EventKindVariation::Full | EventKindVariation::Redacted => {
|
EventKindVariation::Full | EventKindVariation::Redacted => {
|
||||||
// the opposite event variation full -> sync, redacted -> redacted sync
|
let sync = kind.to_event_enum_ident(&var.to_sync().unwrap())?;
|
||||||
let variation = if var == &EventKindVariation::Full {
|
|
||||||
EventKindVariation::Sync
|
|
||||||
} else {
|
|
||||||
EventKindVariation::RedactedSync
|
|
||||||
};
|
|
||||||
|
|
||||||
let sync = kind.to_event_enum_ident(&variation)?;
|
|
||||||
let sync_struct = kind.to_event_ident(&variation)?;
|
|
||||||
|
|
||||||
let ident_variants = variants.iter().map(|v| v.match_arm(&ident));
|
let ident_variants = variants.iter().map(|v| v.match_arm(&ident));
|
||||||
let self_variants = variants.iter().map(|v| v.ctor(quote! { Self }));
|
let self_variants = variants.iter().map(|v| v.ctor(quote! { Self }));
|
||||||
|
|
||||||
let redaction =
|
|
||||||
(*kind == EventKind::Message && *var == EventKindVariation::Full).then(|| {
|
|
||||||
quote! {
|
|
||||||
#ident::RoomRedaction(event) => Self::RoomRedaction(
|
|
||||||
#ruma_events::room::redaction::SyncRedactionEvent::from(event),
|
|
||||||
),
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
Some(quote! {
|
Some(quote! {
|
||||||
impl From<#ident> for #sync {
|
impl From<#ident> for #sync {
|
||||||
fn from(event: #ident) -> Self {
|
fn from(event: #ident) -> Self {
|
||||||
match event {
|
match event {
|
||||||
#(
|
#(
|
||||||
#ident_variants(event) => {
|
#ident_variants(event) => {
|
||||||
#self_variants(#ruma_events::#sync_struct::from(event))
|
#self_variants(::std::convert::From::from(event))
|
||||||
},
|
},
|
||||||
)*
|
)*
|
||||||
#redaction
|
|
||||||
#ident::_Custom(event) => {
|
#ident::_Custom(event) => {
|
||||||
Self::_Custom(#ruma_events::#sync_struct::from(event))
|
Self::_Custom(::std::convert::From::from(event))
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -275,29 +245,14 @@ fn expand_conversion_impl(
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
EventKindVariation::Sync | EventKindVariation::RedactedSync => {
|
EventKindVariation::Sync | EventKindVariation::RedactedSync => {
|
||||||
let variation = if var == &EventKindVariation::Sync {
|
let full = kind.to_event_enum_ident(&var.to_full().unwrap())?;
|
||||||
EventKindVariation::Full
|
|
||||||
} else {
|
|
||||||
EventKindVariation::Redacted
|
|
||||||
};
|
|
||||||
let full = kind.to_event_enum_ident(&variation)?;
|
|
||||||
|
|
||||||
let self_variants = variants.iter().map(|v| v.match_arm(quote! { Self }));
|
let self_variants = variants.iter().map(|v| v.match_arm(quote! { Self }));
|
||||||
let full_variants = variants.iter().map(|v| v.ctor(&full));
|
let full_variants = variants.iter().map(|v| v.ctor(&full));
|
||||||
|
|
||||||
let redaction =
|
|
||||||
(*kind == EventKind::Message && *var == EventKindVariation::Sync).then(|| {
|
|
||||||
quote! {
|
|
||||||
Self::RoomRedaction(event) => {
|
|
||||||
#full::RoomRedaction(event.into_full_event(room_id))
|
|
||||||
},
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
Some(quote! {
|
Some(quote! {
|
||||||
#[automatically_derived]
|
#[automatically_derived]
|
||||||
impl #ident {
|
impl #ident {
|
||||||
/// Convert this sync event into a full event, one with a room_id field.
|
/// Convert this sync event into a full event (one with a `room_id` field).
|
||||||
pub fn into_full_event(
|
pub fn into_full_event(
|
||||||
self,
|
self,
|
||||||
room_id: #ruma_identifiers::RoomId
|
room_id: #ruma_identifiers::RoomId
|
||||||
@ -308,7 +263,6 @@ fn expand_conversion_impl(
|
|||||||
#full_variants(event.into_full_event(room_id))
|
#full_variants(event.into_full_event(room_id))
|
||||||
},
|
},
|
||||||
)*
|
)*
|
||||||
#redaction
|
|
||||||
Self::_Custom(event) => {
|
Self::_Custom(event) => {
|
||||||
#full::_Custom(event.into_full_event(room_id))
|
#full::_Custom(event.into_full_event(room_id))
|
||||||
},
|
},
|
||||||
|
@ -45,6 +45,22 @@ impl EventKindVariation {
|
|||||||
matches!(self, Self::Redacted | Self::RedactedSync)
|
matches!(self, Self::Redacted | Self::RedactedSync)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn to_sync(self) -> Option<Self> {
|
||||||
|
match self {
|
||||||
|
EventKindVariation::Full => Some(EventKindVariation::Sync),
|
||||||
|
EventKindVariation::Redacted => Some(EventKindVariation::RedactedSync),
|
||||||
|
_ => None,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn to_full(self) -> Option<Self> {
|
||||||
|
match self {
|
||||||
|
EventKindVariation::Sync => Some(EventKindVariation::Full),
|
||||||
|
EventKindVariation::RedactedSync => Some(EventKindVariation::Redacted),
|
||||||
|
_ => None,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub fn to_full_variation(self) -> Self {
|
pub fn to_full_variation(self) -> Self {
|
||||||
match self {
|
match self {
|
||||||
EventKindVariation::Redacted | EventKindVariation::RedactedSync => {
|
EventKindVariation::Redacted | EventKindVariation::RedactedSync => {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user