//! Enums for heterogeneous collections of events, exclusive to event types that implement "at //! most" the trait of the same name. use serde::{Serialize, Serializer}; pub use super::{all::StateEvent, raw::only as raw}; use crate::{ call::{ answer::AnswerEvent, candidates::CandidatesEvent, hangup::HangupEvent, invite::InviteEvent, }, direct::DirectEvent, dummy::DummyEvent, forwarded_room_key::ForwardedRoomKeyEvent, fully_read::FullyReadEvent, ignored_user_list::IgnoredUserListEvent, key::verification::{ accept::AcceptEvent, cancel::CancelEvent, key::KeyEvent, mac::MacEvent, request::RequestEvent, start::StartEvent, }, presence::PresenceEvent, push_rules::PushRulesEvent, receipt::ReceiptEvent, room::{ encrypted::EncryptedEvent, message::{feedback::FeedbackEvent, MessageEvent}, redaction::RedactionEvent, }, room_key::RoomKeyEvent, room_key_request::RoomKeyRequestEvent, sticker::StickerEvent, tag::TagEvent, typing::TypingEvent, CustomEvent, CustomRoomEvent, EventResultCompatible, Void, }; /// A basic event. #[derive(Clone, Debug)] #[allow(clippy::large_enum_variant)] pub enum Event { /// m.direct Direct(DirectEvent), /// m.dummy Dummy(DummyEvent), /// m.forwarded_room_key ForwardedRoomKey(ForwardedRoomKeyEvent), /// m.fully_read FullyRead(FullyReadEvent), /// m.key.verification.accept KeyVerificationAccept(AcceptEvent), /// m.key.verification.cancel KeyVerificationCancel(CancelEvent), /// m.key.verification.key KeyVerificationKey(KeyEvent), /// m.key.verification.mac KeyVerificationMac(MacEvent), /// m.key.verification.request KeyVerificationRequest(RequestEvent), /// m.key.verification.start KeyVerificationStart(StartEvent), /// m.ignored_user_list IgnoredUserList(IgnoredUserListEvent), /// m.presence Presence(PresenceEvent), /// m.push_rules PushRules(PushRulesEvent), /// m.room_key RoomKey(RoomKeyEvent), /// m.room_key_request RoomKeyRequest(RoomKeyRequestEvent), /// m.receipt Receipt(ReceiptEvent), /// m.tag Tag(TagEvent), /// m.typing Typing(TypingEvent), /// Any basic event that is not part of the specification. Custom(CustomEvent), } /// A room event. #[derive(Clone, Debug)] #[allow(clippy::large_enum_variant)] pub enum RoomEvent { /// m.call.answer CallAnswer(AnswerEvent), /// m.call.candidates CallCandidates(CandidatesEvent), /// m.call.hangup CallHangup(HangupEvent), /// m.call.invite CallInvite(InviteEvent), /// m.room.encrypted RoomEncrypted(EncryptedEvent), /// m.room.message RoomMessage(MessageEvent), /// m.room.message.feedback RoomMessageFeedback(FeedbackEvent), /// m.room.redaction RoomRedaction(RedactionEvent), /// m.sticker Sticker(StickerEvent), /// Any room event that is not part of the specification. CustomRoom(CustomRoomEvent), } impl EventResultCompatible for Event { type Raw = raw::Event; type Err = Void; fn try_from_raw(raw: raw::Event) -> Result { unimplemented!() } } impl EventResultCompatible for RoomEvent { type Raw = raw::RoomEvent; type Err = Void; fn try_from_raw(raw: raw::RoomEvent) -> Result { unimplemented!() } } impl Serialize for Event { fn serialize(&self, serializer: S) -> Result where S: Serializer, { match *self { Event::Direct(ref event) => event.serialize(serializer), Event::Dummy(ref event) => event.serialize(serializer), Event::ForwardedRoomKey(ref event) => event.serialize(serializer), Event::FullyRead(ref event) => event.serialize(serializer), Event::KeyVerificationAccept(ref event) => event.serialize(serializer), Event::KeyVerificationCancel(ref event) => event.serialize(serializer), Event::KeyVerificationKey(ref event) => event.serialize(serializer), Event::KeyVerificationMac(ref event) => event.serialize(serializer), Event::KeyVerificationRequest(ref event) => event.serialize(serializer), Event::KeyVerificationStart(ref event) => event.serialize(serializer), Event::IgnoredUserList(ref event) => event.serialize(serializer), Event::Presence(ref event) => event.serialize(serializer), Event::PushRules(ref event) => event.serialize(serializer), Event::Receipt(ref event) => event.serialize(serializer), Event::RoomKey(ref event) => event.serialize(serializer), Event::RoomKeyRequest(ref event) => event.serialize(serializer), Event::Tag(ref event) => event.serialize(serializer), Event::Typing(ref event) => event.serialize(serializer), Event::Custom(ref event) => event.serialize(serializer), } } } impl Serialize for RoomEvent { fn serialize(&self, serializer: S) -> Result where S: Serializer, { match *self { RoomEvent::CallAnswer(ref event) => event.serialize(serializer), RoomEvent::CallCandidates(ref event) => event.serialize(serializer), RoomEvent::CallHangup(ref event) => event.serialize(serializer), RoomEvent::CallInvite(ref event) => event.serialize(serializer), RoomEvent::RoomEncrypted(ref event) => event.serialize(serializer), RoomEvent::RoomMessage(ref event) => event.serialize(serializer), RoomEvent::RoomMessageFeedback(ref event) => event.serialize(serializer), RoomEvent::RoomRedaction(ref event) => event.serialize(serializer), RoomEvent::Sticker(ref event) => event.serialize(serializer), RoomEvent::CustomRoom(ref event) => event.serialize(serializer), } } } macro_rules! impl_from_t_for_event { ($ty:ty, $variant:ident) => { impl From<$ty> for Event { fn from(event: $ty) -> Self { Event::$variant(event) } } }; } impl_from_t_for_event!(DirectEvent, Direct); impl_from_t_for_event!(DummyEvent, Dummy); impl_from_t_for_event!(ForwardedRoomKeyEvent, ForwardedRoomKey); impl_from_t_for_event!(FullyReadEvent, FullyRead); impl_from_t_for_event!(AcceptEvent, KeyVerificationAccept); impl_from_t_for_event!(CancelEvent, KeyVerificationCancel); impl_from_t_for_event!(KeyEvent, KeyVerificationKey); impl_from_t_for_event!(MacEvent, KeyVerificationMac); impl_from_t_for_event!(RequestEvent, KeyVerificationRequest); impl_from_t_for_event!(StartEvent, KeyVerificationStart); impl_from_t_for_event!(IgnoredUserListEvent, IgnoredUserList); impl_from_t_for_event!(PresenceEvent, Presence); impl_from_t_for_event!(PushRulesEvent, PushRules); impl_from_t_for_event!(ReceiptEvent, Receipt); impl_from_t_for_event!(TagEvent, Tag); impl_from_t_for_event!(TypingEvent, Typing); impl_from_t_for_event!(CustomEvent, Custom); macro_rules! impl_from_t_for_room_event { ($ty:ty, $variant:ident) => { impl From<$ty> for RoomEvent { fn from(event: $ty) -> Self { RoomEvent::$variant(event) } } }; } impl_from_t_for_room_event!(AnswerEvent, CallAnswer); impl_from_t_for_room_event!(CandidatesEvent, CallCandidates); impl_from_t_for_room_event!(HangupEvent, CallHangup); impl_from_t_for_room_event!(InviteEvent, CallInvite); impl_from_t_for_room_event!(EncryptedEvent, RoomEncrypted); impl_from_t_for_room_event!(MessageEvent, RoomMessage); impl_from_t_for_room_event!(FeedbackEvent, RoomMessageFeedback); impl_from_t_for_room_event!(RedactionEvent, RoomRedaction); impl_from_t_for_room_event!(StickerEvent, Sticker); impl_from_t_for_room_event!(CustomRoomEvent, CustomRoom);