248 lines
7.8 KiB
Rust
248 lines
7.8 KiB
Rust
//! 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<Self, (Self::Err, Self::Raw)> {
|
|
unimplemented!()
|
|
}
|
|
}
|
|
|
|
impl EventResultCompatible for RoomEvent {
|
|
type Raw = raw::RoomEvent;
|
|
type Err = Void;
|
|
|
|
fn try_from_raw(raw: raw::RoomEvent) -> Result<Self, (Self::Err, Self::Raw)> {
|
|
unimplemented!()
|
|
}
|
|
}
|
|
|
|
impl Serialize for Event {
|
|
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
|
|
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<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
|
|
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);
|