use ruma_events_macros::event_enum;
use serde::{de, Serialize};
use serde_json::value::RawValue as RawJsonValue;
use crate::{from_raw_json_value, EventDeHelper};
event_enum! {
kind: Basic,
events: [
"m.direct",
"m.dummy",
"m.ignored_user_list",
"m.presence",
"m.push_rules",
"m.room_key",
"m.tag",
]
}
event_enum! {
kind: EphemeralRoom,
events: [
"m.fully_read",
"m.receipt",
"m.typing",
]
}
event_enum! {
kind: Message,
events: [
"m.call.answer",
"m.call.invite",
"m.call.hangup",
"m.call.candidates",
#[cfg(feature = "unstable-pre-spec")]
#[cfg_attr(docsrs, doc(cfg(feature = "unstable-pre-spec")))]
"m.key.verification.ready",
#[cfg(feature = "unstable-pre-spec")]
#[cfg_attr(docsrs, doc(cfg(feature = "unstable-pre-spec")))]
"m.key.verification.start",
#[cfg(feature = "unstable-pre-spec")]
#[cfg_attr(docsrs, doc(cfg(feature = "unstable-pre-spec")))]
"m.key.verification.cancel",
#[cfg(feature = "unstable-pre-spec")]
#[cfg_attr(docsrs, doc(cfg(feature = "unstable-pre-spec")))]
"m.key.verification.accept",
#[cfg(feature = "unstable-pre-spec")]
#[cfg_attr(docsrs, doc(cfg(feature = "unstable-pre-spec")))]
"m.key.verification.key",
#[cfg(feature = "unstable-pre-spec")]
#[cfg_attr(docsrs, doc(cfg(feature = "unstable-pre-spec")))]
"m.key.verification.mac",
#[cfg(feature = "unstable-pre-spec")]
#[cfg_attr(docsrs, doc(cfg(feature = "unstable-pre-spec")))]
"m.key.verification.done",
#[cfg(feature = "unstable-pre-spec")]
#[cfg_attr(docsrs, doc(cfg(feature = "unstable-pre-spec")))]
"m.reaction",
"m.room.encrypted",
"m.room.message",
"m.room.message.feedback",
"m.room.redaction",
"m.sticker",
]
}
event_enum! {
kind: State,
events: [
"m.policy.rule.room",
"m.policy.rule.server",
"m.policy.rule.user",
"m.room.aliases",
"m.room.avatar",
"m.room.canonical_alias",
"m.room.create",
"m.room.encryption",
"m.room.guest_access",
"m.room.history_visibility",
"m.room.join_rules",
"m.room.member",
"m.room.name",
"m.room.pinned_events",
"m.room.power_levels",
"m.room.server_acl",
"m.room.third_party_invite",
"m.room.tombstone",
"m.room.topic",
]
}
event_enum! {
kind: ToDevice,
events: [
"m.dummy",
"m.room_key",
"m.room_key_request",
"m.forwarded_room_key",
"m.key.verification.request",
"m.key.verification.start",
"m.key.verification.cancel",
"m.key.verification.accept",
"m.key.verification.key",
"m.key.verification.mac",
"m.room.encrypted",
]
}
#[allow(clippy::large_enum_variant)]
#[derive(Clone, Debug, Serialize)]
#[serde(untagged)]
pub enum AnyEvent {
Basic(AnyBasicEvent),
Ephemeral(AnyEphemeralRoomEvent),
Message(AnyMessageEvent),
State(AnyStateEvent),
RedactedMessage(AnyRedactedMessageEvent),
RedactedState(AnyRedactedStateEvent),
}
#[allow(clippy::large_enum_variant)]
#[derive(Clone, Debug, Serialize)]
#[serde(untagged)]
pub enum AnyRoomEvent {
Message(AnyMessageEvent),
State(AnyStateEvent),
RedactedMessage(AnyRedactedMessageEvent),
RedactedState(AnyRedactedStateEvent),
}
#[allow(clippy::large_enum_variant)]
#[derive(Clone, Debug, Serialize)]
#[serde(untagged)]
pub enum AnySyncRoomEvent {
Message(AnySyncMessageEvent),
State(AnySyncStateEvent),
RedactedMessage(AnyRedactedSyncMessageEvent),
RedactedState(AnyRedactedSyncStateEvent),
}
impl<'de> de::Deserialize<'de> for AnyEvent {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: de::Deserializer<'de>,
{
let json = Box::<RawJsonValue>::deserialize(deserializer)?;
let EventDeHelper { state_key, event_id, room_id, unsigned, .. } =
from_raw_json_value(&json)?;
if state_key.is_some() {
Ok(match unsigned {
Some(unsigned) if unsigned.redacted_because.is_some() => {
AnyEvent::RedactedState(from_raw_json_value(&json)?)
}
_ => AnyEvent::State(from_raw_json_value(&json)?),
})
} else if event_id.is_some() {
Ok(match unsigned {
Some(unsigned) if unsigned.redacted_because.is_some() => {
AnyEvent::RedactedMessage(from_raw_json_value(&json)?)
}
_ => AnyEvent::Message(from_raw_json_value(&json)?),
})
} else if room_id.is_some() {
Ok(AnyEvent::Ephemeral(from_raw_json_value(&json)?))
} else {
Ok(AnyEvent::Basic(from_raw_json_value(&json)?))
}
}
}
impl<'de> de::Deserialize<'de> for AnyRoomEvent {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: de::Deserializer<'de>,
{
let json = Box::<RawJsonValue>::deserialize(deserializer)?;
let EventDeHelper { state_key, unsigned, .. } = from_raw_json_value(&json)?;
if state_key.is_some() {
Ok(match unsigned {
Some(unsigned) if unsigned.redacted_because.is_some() => {
AnyRoomEvent::RedactedState(from_raw_json_value(&json)?)
}
_ => AnyRoomEvent::State(from_raw_json_value(&json)?),
})
} else {
Ok(match unsigned {
Some(unsigned) if unsigned.redacted_because.is_some() => {
AnyRoomEvent::RedactedMessage(from_raw_json_value(&json)?)
}
_ => AnyRoomEvent::Message(from_raw_json_value(&json)?),
})
}
}
}
impl<'de> de::Deserialize<'de> for AnySyncRoomEvent {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: de::Deserializer<'de>,
{
let json = Box::<RawJsonValue>::deserialize(deserializer)?;
let EventDeHelper { state_key, unsigned, .. } = from_raw_json_value(&json)?;
if state_key.is_some() {
Ok(match unsigned {
Some(unsigned) if unsigned.redacted_because.is_some() => {
AnySyncRoomEvent::RedactedState(from_raw_json_value(&json)?)
}
_ => AnySyncRoomEvent::State(from_raw_json_value(&json)?),
})
} else {
Ok(match unsigned {
Some(unsigned) if unsigned.redacted_because.is_some() => {
AnySyncRoomEvent::RedactedMessage(from_raw_json_value(&json)?)
}
_ => AnySyncRoomEvent::Message(from_raw_json_value(&json)?),
})
}
}
}