From 526542c2461fe50fc34f30b80fb15b7b079b52c6 Mon Sep 17 00:00:00 2001 From: Akshay Date: Fri, 12 Feb 2021 13:33:09 +0100 Subject: [PATCH] events: Replace derived Deserialize for MessageEventContent with a manual impl Co-authored-by: Jonas Platte --- ruma-events/src/room/message.rs | 3 +- ruma-events/src/room/message/content_serde.rs | 38 +++++++++++++++++++ 2 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 ruma-events/src/room/message/content_serde.rs diff --git a/ruma-events/src/room/message.rs b/ruma-events/src/room/message.rs index 51ace353..ff640159 100644 --- a/ruma-events/src/room/message.rs +++ b/ruma-events/src/room/message.rs @@ -18,6 +18,7 @@ use super::{relationships::RelatesToJsonRepr, EncryptedFile, ImageInfo, Thumbnai // FIXME: Do we want to keep re-exporting this? pub use super::relationships::InReplyTo; +mod content_serde; pub mod feedback; use crate::MessageEvent as OuterMessageEvent; @@ -28,7 +29,7 @@ use crate::MessageEvent as OuterMessageEvent; pub type MessageEvent = OuterMessageEvent; /// The payload for `MessageEvent`. -#[derive(Clone, Debug, Deserialize, Serialize, MessageEventContent)] +#[derive(Clone, Debug, Serialize, MessageEventContent)] #[cfg_attr(not(feature = "unstable-exhaustive-types"), non_exhaustive)] #[ruma_event(type = "m.room.message")] #[serde(tag = "msgtype")] diff --git a/ruma-events/src/room/message/content_serde.rs b/ruma-events/src/room/message/content_serde.rs new file mode 100644 index 00000000..1e8e4bf0 --- /dev/null +++ b/ruma-events/src/room/message/content_serde.rs @@ -0,0 +1,38 @@ +//! `Deserialize` implementation for MessageEventContent + +use serde::{de, Deserialize}; +use serde_json::value::RawValue as RawJsonValue; + +use crate::{from_raw_json_value, room::message::MessageEventContent}; + +/// Helper struct to determine the msgtype from a `serde_json::value::RawValue` +#[derive(Debug, Deserialize)] +struct MessageDeHelper { + /// The message type field + msgtype: String, +} + +impl<'de> de::Deserialize<'de> for MessageEventContent { + fn deserialize(deserializer: D) -> Result + where + D: de::Deserializer<'de>, + { + let json = Box::::deserialize(deserializer)?; + let MessageDeHelper { msgtype } = from_raw_json_value(&json)?; + + Ok(match msgtype.as_ref() { + "m.audio" => Self::Audio(from_raw_json_value(&json)?), + "m.emote" => Self::Emote(from_raw_json_value(&json)?), + "m.file" => Self::File(from_raw_json_value(&json)?), + "m.image" => Self::Image(from_raw_json_value(&json)?), + "m.location" => Self::Location(from_raw_json_value(&json)?), + "m.notice" => Self::Notice(from_raw_json_value(&json)?), + "m.server_notice" => Self::ServerNotice(from_raw_json_value(&json)?), + "m.text" => Self::Text(from_raw_json_value(&json)?), + "m.video" => Self::Video(from_raw_json_value(&json)?), + #[cfg(feature = "unstable-pre-spec")] + "m.key.verification.request" => Self::VerificationRequest(from_raw_json_value(&json)?), + _ => return Err(de::Error::custom("unknown msgtype")), + }) + } +}