diff --git a/crates/ruma-common/src/events/audio.rs b/crates/ruma-common/src/events/audio.rs index dc044036..26b1bb33 100644 --- a/crates/ruma-common/src/events/audio.rs +++ b/crates/ruma-common/src/events/audio.rs @@ -40,7 +40,7 @@ pub struct AudioEventContent { /// Information about related messages. #[serde(flatten, skip_serializing_if = "Option::is_none")] - pub relates_to: Option, + pub relates_to: Option>, } impl AudioEventContent { diff --git a/crates/ruma-common/src/events/emote.rs b/crates/ruma-common/src/events/emote.rs index 9725e374..5f87f66f 100644 --- a/crates/ruma-common/src/events/emote.rs +++ b/crates/ruma-common/src/events/emote.rs @@ -24,7 +24,7 @@ pub struct EmoteEventContent { /// Information about related messages. #[serde(flatten, skip_serializing_if = "Option::is_none")] - pub relates_to: Option, + pub relates_to: Option>, } impl EmoteEventContent { diff --git a/crates/ruma-common/src/events/file.rs b/crates/ruma-common/src/events/file.rs index b9c9b3d0..0a95c56f 100644 --- a/crates/ruma-common/src/events/file.rs +++ b/crates/ruma-common/src/events/file.rs @@ -35,7 +35,7 @@ pub struct FileEventContent { /// Information about related messages. #[serde(flatten, skip_serializing_if = "Option::is_none")] - pub relates_to: Option, + pub relates_to: Option>, } impl FileEventContent { diff --git a/crates/ruma-common/src/events/image.rs b/crates/ruma-common/src/events/image.rs index 61004125..03124f16 100644 --- a/crates/ruma-common/src/events/image.rs +++ b/crates/ruma-common/src/events/image.rs @@ -51,7 +51,7 @@ pub struct ImageEventContent { /// Information about related messages. #[serde(flatten, skip_serializing_if = "Option::is_none")] - pub relates_to: Option, + pub relates_to: Option>, } impl ImageEventContent { diff --git a/crates/ruma-common/src/events/location.rs b/crates/ruma-common/src/events/location.rs index 60dd52ae..c7e180dd 100644 --- a/crates/ruma-common/src/events/location.rs +++ b/crates/ruma-common/src/events/location.rs @@ -40,7 +40,7 @@ pub struct LocationEventContent { /// Information about related messages. #[serde(flatten, skip_serializing_if = "Option::is_none")] - pub relates_to: Option, + pub relates_to: Option>, } impl LocationEventContent { diff --git a/crates/ruma-common/src/events/message.rs b/crates/ruma-common/src/events/message.rs index b6925e00..7c129790 100644 --- a/crates/ruma-common/src/events/message.rs +++ b/crates/ruma-common/src/events/message.rs @@ -73,7 +73,7 @@ pub struct MessageEventContent { /// Information about related messages. #[serde(flatten, skip_serializing_if = "Option::is_none")] - pub relates_to: Option, + pub relates_to: Option>, } impl MessageEventContent { diff --git a/crates/ruma-common/src/events/notice.rs b/crates/ruma-common/src/events/notice.rs index f6e4ab25..f593ef9b 100644 --- a/crates/ruma-common/src/events/notice.rs +++ b/crates/ruma-common/src/events/notice.rs @@ -24,7 +24,7 @@ pub struct NoticeEventContent { /// Information about related messages. #[serde(flatten, skip_serializing_if = "Option::is_none")] - pub relates_to: Option, + pub relates_to: Option>, } impl NoticeEventContent { diff --git a/crates/ruma-common/src/events/room/encrypted.rs b/crates/ruma-common/src/events/room/encrypted.rs index c2c98d7f..fd034a2b 100644 --- a/crates/ruma-common/src/events/room/encrypted.rs +++ b/crates/ruma-common/src/events/room/encrypted.rs @@ -107,8 +107,8 @@ pub enum Relation { _Custom, } -impl From for Relation { - fn from(rel: message::Relation) -> Self { +impl From> for Relation { + fn from(rel: message::Relation) -> Self { match rel { message::Relation::Reply { in_reply_to } => Self::Reply { in_reply_to }, message::Relation::Replacement(re) => { diff --git a/crates/ruma-common/src/events/room/message.rs b/crates/ruma-common/src/events/room/message.rs index 20d278ed..21816aeb 100644 --- a/crates/ruma-common/src/events/room/message.rs +++ b/crates/ruma-common/src/events/room/message.rs @@ -62,7 +62,7 @@ pub struct RoomMessageEventContent { /// /// [rich replies]: https://spec.matrix.org/v1.2/client-server-api/#rich-replies #[serde(flatten, skip_serializing_if = "Option::is_none")] - pub relates_to: Option, + pub relates_to: Option>, } impl RoomMessageEventContent { @@ -467,7 +467,7 @@ impl From for MessageType { #[derive(Clone, Debug)] #[allow(clippy::manual_non_exhaustive)] #[cfg_attr(not(feature = "unstable-exhaustive-types"), non_exhaustive)] -pub enum Relation { +pub enum Relation { /// An `m.in_reply_to` relation indicating that the event is a reply to another event. Reply { /// Information about another message being replied to. @@ -475,7 +475,7 @@ pub enum Relation { }, /// An event that replaces another event. - Replacement(Replacement), + Replacement(Replacement), /// An event that belongs to a thread. Thread(Thread), @@ -504,17 +504,17 @@ impl InReplyTo { /// [replaces another event]: https://spec.matrix.org/v1.4/client-server-api/#event-replacements #[derive(Clone, Debug)] #[cfg_attr(not(feature = "unstable-exhaustive-types"), non_exhaustive)] -pub struct Replacement { +pub struct Replacement { /// The ID of the event being replaced. pub event_id: OwnedEventId, /// New content. - pub new_content: Box, + pub new_content: C, } -impl Replacement { +impl Replacement { /// Creates a new `Replacement` with the given event ID and new content. - pub fn new(event_id: OwnedEventId, new_content: Box) -> Self { + pub fn new(event_id: OwnedEventId, new_content: C) -> Self { Self { event_id, new_content } } } diff --git a/crates/ruma-common/src/events/room/message/content_serde.rs b/crates/ruma-common/src/events/room/message/content_serde.rs index 7ca61cee..fe0b1ccb 100644 --- a/crates/ruma-common/src/events/room/message/content_serde.rs +++ b/crates/ruma-common/src/events/room/message/content_serde.rs @@ -47,8 +47,8 @@ impl<'de> Deserialize<'de> for RoomMessageEventContent { { let json = Box::::deserialize(deserializer)?; let mut deserializer = serde_json::Deserializer::from_str(json.get()); - let relates_to = - Option::::deserialize(&mut deserializer).map_err(de::Error::custom)?; + let relates_to = Option::>::deserialize(&mut deserializer) + .map_err(de::Error::custom)?; Ok(Self { msgtype: from_raw_json_value(&json)?, relates_to }) } diff --git a/crates/ruma-common/src/events/room/message/relation_serde.rs b/crates/ruma-common/src/events/room/message/relation_serde.rs index 2953adeb..ce0dfb5d 100644 --- a/crates/ruma-common/src/events/room/message/relation_serde.rs +++ b/crates/ruma-common/src/events/room/message/relation_serde.rs @@ -1,9 +1,12 @@ use serde::{Deserialize, Deserializer, Serialize, Serializer}; -use super::{InReplyTo, Relation, Replacement, RoomMessageEventContent, Thread}; +use super::{InReplyTo, Relation, Replacement, Thread}; use crate::OwnedEventId; -impl<'de> Deserialize<'de> for Relation { +impl<'de, C> Deserialize<'de> for Relation +where + C: Deserialize<'de>, +{ fn deserialize(deserializer: D) -> Result where D: Deserializer<'de>, @@ -47,17 +50,22 @@ impl<'de> Deserialize<'de> for Relation { } } -impl Serialize for Relation { +impl Serialize for Relation +where + C: Clone + Serialize, +{ fn serialize(&self, serializer: S) -> Result where S: Serializer, { #[allow(clippy::needless_update)] let json_repr = match self { - Relation::Reply { in_reply_to } => EventWithRelatesToJsonRepr::new(RelatesToJsonRepr { - in_reply_to: Some(in_reply_to.clone()), - ..Default::default() - }), + Relation::Reply { in_reply_to } => { + EventWithRelatesToJsonRepr::::new(RelatesToJsonRepr { + in_reply_to: Some(in_reply_to.clone()), + ..Default::default() + }) + } Relation::Replacement(Replacement { event_id, new_content }) => { EventWithRelatesToJsonRepr { relates_to: RelatesToJsonRepr { @@ -79,28 +87,34 @@ impl Serialize for Relation { ..Default::default() }) } - Relation::_Custom => EventWithRelatesToJsonRepr::default(), + Relation::_Custom => EventWithRelatesToJsonRepr::::default(), }; json_repr.serialize(serializer) } } -#[derive(Default, Deserialize, Serialize)] -struct EventWithRelatesToJsonRepr { +#[derive(Deserialize, Serialize)] +struct EventWithRelatesToJsonRepr { #[serde(rename = "m.relates_to", default, skip_serializing_if = "RelatesToJsonRepr::is_empty")] relates_to: RelatesToJsonRepr, #[serde(rename = "m.new_content", skip_serializing_if = "Option::is_none")] - new_content: Option>, + new_content: Option, } -impl EventWithRelatesToJsonRepr { +impl EventWithRelatesToJsonRepr { fn new(relates_to: RelatesToJsonRepr) -> Self { Self { relates_to, new_content: None } } } +impl Default for EventWithRelatesToJsonRepr { + fn default() -> Self { + Self { relates_to: RelatesToJsonRepr::default(), new_content: None } + } +} + /// Struct modeling the different ways relationships can be expressed in a `m.relates_to` field of /// an event. #[derive(Default, Deserialize, Serialize)] diff --git a/crates/ruma-common/src/events/video.rs b/crates/ruma-common/src/events/video.rs index 90777574..f3c3cf69 100644 --- a/crates/ruma-common/src/events/video.rs +++ b/crates/ruma-common/src/events/video.rs @@ -50,7 +50,7 @@ pub struct VideoEventContent { /// Information about related messages. #[serde(flatten, skip_serializing_if = "Option::is_none")] - pub relates_to: Option, + pub relates_to: Option>, } impl VideoEventContent { diff --git a/crates/ruma-common/src/events/voice.rs b/crates/ruma-common/src/events/voice.rs index 2822fbd7..2d5b824c 100644 --- a/crates/ruma-common/src/events/voice.rs +++ b/crates/ruma-common/src/events/voice.rs @@ -38,7 +38,7 @@ pub struct VoiceEventContent { /// Information about related messages. #[serde(flatten, skip_serializing_if = "Option::is_none")] - pub relates_to: Option, + pub relates_to: Option>, } impl VoiceEventContent { diff --git a/crates/ruma-common/tests/events/relations.rs b/crates/ruma-common/tests/events/relations.rs index ff153c9a..ec7dced6 100644 --- a/crates/ruma-common/tests/events/relations.rs +++ b/crates/ruma-common/tests/events/relations.rs @@ -75,7 +75,7 @@ fn replacement_serialize() { relates_to: Some(Relation::Replacement( Replacement::new( event_id!("$1598361704261elfgc").to_owned(), - Box::new(RoomMessageEventContent::text_plain("This is the new content.")), + RoomMessageEventContent::text_plain("This is the new content.").into(), ) )) } @@ -142,7 +142,7 @@ fn replacement_deserialize() { }) => replacement ); assert_eq!(replacement.event_id, "$1598361704261elfgc"); - let text = assert_matches!(replacement.new_content.msgtype, MessageType::Text(text) => text); + let text = assert_matches!(replacement.new_content, MessageType::Text(text) => text); assert_eq!(text.body, "Hello! My name is bar"); } diff --git a/crates/ruma-common/tests/events/without_relation.rs b/crates/ruma-common/tests/events/without_relation.rs index 33998ad7..1d828edd 100644 --- a/crates/ruma-common/tests/events/without_relation.rs +++ b/crates/ruma-common/tests/events/without_relation.rs @@ -1,10 +1,7 @@ use assert_matches::assert_matches; use ruma_common::{ event_id, - events::room::message::{ - InReplyTo, MessageType, Relation, RoomMessageEventContent, - RoomMessageEventContentWithoutRelation, - }, + events::room::message::{InReplyTo, MessageType, Relation, RoomMessageEventContent}, }; use serde_json::{from_value as from_json_value, json, to_value as to_json_value}; @@ -13,7 +10,7 @@ fn serialize_room_message_content_without_relation() { let mut content = RoomMessageEventContent::text_plain("Hello, world!"); content.relates_to = Some(Relation::Reply { in_reply_to: InReplyTo::new(event_id!("$eventId").to_owned()) }); - let without_relation = RoomMessageEventContentWithoutRelation::from(content); + let without_relation = MessageType::from(content); #[cfg(not(feature = "unstable-msc3246"))] assert_eq!( @@ -43,8 +40,8 @@ fn deserialize_room_message_content_without_relation() { }); let text = assert_matches!( - from_json_value::(json_data), - Ok(RoomMessageEventContentWithoutRelation::Text(text)) => text + from_json_value::(json_data), + Ok(MessageType::Text(text)) => text ); assert_eq!(text.body, "Hello, world!"); } @@ -54,8 +51,7 @@ fn convert_room_message_content_without_relation_to_full() { let mut content = RoomMessageEventContent::text_plain("Hello, world!"); content.relates_to = Some(Relation::Reply { in_reply_to: InReplyTo::new(event_id!("$eventId").to_owned()) }); - let new_content = - RoomMessageEventContent::from(RoomMessageEventContentWithoutRelation::from(content)); + let new_content = RoomMessageEventContent::from(MessageType::from(content)); let (text, relates_to) = assert_matches!( new_content,