Breaking ruma-events
› published on byThis week in ruma-events' Google Summer of Code project, I was able to finish the macros needed to generate the event content enums and trait implementations required for events. I started by defining the generic event structs (state, message, etc.) and manually writing the Serialize
and Deserialize
implementations. Over the next few days, this was moved into a custom derive macro called Event
. The derive now implements all necessary traits with appropriate bounds, so a StateEvent<C>
can not contain any ephemeral event content and so forth. I have removed the raw
mod and related FromRaw
and TryFromRaw
traits, moving the validation into the deserialization and constructor for the few types that needed it. On the event content side of things, a function like procedural macro was used to allow declaring the enum using Matrix event type identifiers.
event_content_enum! {
/// Any message event.
name: AnyMessageEventContent,
events: [
"m.call.answer",
"m.room.message",
// ...
]
}
// Produces
pub enum AnyMessageEventContent {
CallAnswer(CallAnswerEventContent),
RoomMessage(MessageEventContent),
}