diff --git a/crates/ruma-events/src/room/message.rs b/crates/ruma-events/src/room/message.rs
index c3252332..394f0862 100644
--- a/crates/ruma-events/src/room/message.rs
+++ b/crates/ruma-events/src/room/message.rs
@@ -2,7 +2,6 @@
use std::{borrow::Cow, fmt};
-use indoc::formatdoc;
use js_int::UInt;
use ruma_events_macros::EventContent;
#[cfg(feature = "unstable-pre-spec")]
@@ -19,6 +18,7 @@ use crate::key::verification::VerificationMethod;
mod content_serde;
pub mod feedback;
mod relation_serde;
+mod reply;
/// The content of an `m.room.message` event.
///
@@ -82,7 +82,7 @@ impl RoomMessageEventContent {
/// Creates a plain text reply to a message.
pub fn text_reply_plain(reply: impl fmt::Display, original_message: &RoomMessageEvent) -> Self {
- let quoted = get_plain_quote_fallback(original_message);
+ let quoted = reply::get_plain_quote_fallback(original_message);
let body = format!("{}\n\n{}", quoted, reply);
@@ -100,8 +100,8 @@ impl RoomMessageEventContent {
html_reply: impl fmt::Display,
original_message: &RoomMessageEvent,
) -> Self {
- let quoted = get_plain_quote_fallback(original_message);
- let quoted_html = get_html_quote_fallback(original_message);
+ let quoted = reply::get_plain_quote_fallback(original_message);
+ let quoted_html = reply::get_html_quote_fallback(original_message);
let body = format!("{}\n\n{}", quoted, reply);
let html_body = format!("{}\n\n{}", quoted_html, html_reply);
@@ -119,7 +119,7 @@ impl RoomMessageEventContent {
reply: impl fmt::Display,
original_message: &RoomMessageEvent,
) -> Self {
- let quoted = get_plain_quote_fallback(original_message);
+ let quoted = reply::get_plain_quote_fallback(original_message);
let body = format!("{}\n\n{}", quoted, reply);
Self {
@@ -136,8 +136,8 @@ impl RoomMessageEventContent {
html_reply: impl fmt::Display,
original_message: &RoomMessageEvent,
) -> Self {
- let quoted = get_plain_quote_fallback(original_message);
- let quoted_html = get_html_quote_fallback(original_message);
+ let quoted = reply::get_plain_quote_fallback(original_message);
+ let quoted_html = reply::get_html_quote_fallback(original_message);
let body = format!("{}\n\n{}", quoted, reply);
let html_body = format!("{}\n\n{}", quoted_html, html_reply);
@@ -979,263 +979,13 @@ pub struct CustomEventContent {
data: JsonObject,
}
-fn get_plain_quote_fallback(original_message: &RoomMessageEvent) -> String {
- match &original_message.content.msgtype {
- MessageType::Audio(_) => {
- format!("> <{:?}> sent an audio file.", original_message.sender)
- }
- MessageType::Emote(content) => {
- format!("> * <{:?}> {}", original_message.sender, content.body)
- }
- MessageType::File(_) => {
- format!("> <{:?}> sent a file.", original_message.sender)
- }
- MessageType::Image(_) => {
- format!("> <{:?}> sent an image.", original_message.sender)
- }
- MessageType::Location(content) => {
- format!("> <{:?}> {}", original_message.sender, content.body)
- }
- MessageType::Notice(content) => {
- format!("> <{:?}> {}", original_message.sender, content.body)
- }
- MessageType::ServerNotice(content) => {
- format!("> <{:?}> {}", original_message.sender, content.body)
- }
- MessageType::Text(content) => {
- format!("> <{:?}> {}", original_message.sender, content.body)
- }
- MessageType::Video(_) => {
- format!("> <{:?}> sent a video.", original_message.sender)
- }
- MessageType::_Custom(content) => {
- format!("> <{:?}> {}", original_message.sender, content.body)
- }
- #[cfg(feature = "unstable-pre-spec")]
- MessageType::VerificationRequest(content) => {
- format!("> <{:?}> {}", original_message.sender, content.body)
- }
- }
- .replace('\n', "\n> ")
-}
-
-#[allow(clippy::nonstandard_macro_braces)]
-fn get_html_quote_fallback(original_message: &RoomMessageEvent) -> String {
- match &original_message.content.msgtype {
- MessageType::Audio(_) => {
- formatdoc!(
- "
-
-
- In reply to
- {sender}
-
- sent an audio file.
-
-
- ",
- room_id = original_message.room_id,
- event_id = original_message.event_id,
- sender = original_message.sender,
- )
- }
- MessageType::Emote(content) => {
- formatdoc!(
- "
-
-
- In reply to
- * {sender}
-
- {body}
-
-
- ",
- room_id = original_message.room_id,
- event_id = original_message.event_id,
- sender = original_message.sender,
- body = formatted_or_plain_body(&content.formatted, &content.body),
- )
- }
- MessageType::File(_) => {
- formatdoc!(
- "
-
-
- In reply to
- {sender}
-
- sent a file.
-
-
- ",
- room_id = original_message.room_id,
- event_id = original_message.event_id,
- sender = original_message.sender,
- )
- }
- MessageType::Image(_) => {
- formatdoc!(
- "
-
-
- In reply to
- {sender}
-
- sent an image.
-
-
- ",
- room_id = original_message.room_id,
- event_id = original_message.event_id,
- sender = original_message.sender,
- )
- }
- MessageType::Location(_) => {
- formatdoc!(
- "
-
-
- In reply to
- {sender}
-
- sent a location.
-
-
- ",
- room_id = original_message.room_id,
- event_id = original_message.event_id,
- sender = original_message.sender,
- )
- }
- MessageType::Notice(content) => {
- formatdoc!(
- "
-
-
- In reply to
- {sender}
-
- {body}
-
-
- ",
- room_id = original_message.room_id,
- event_id = original_message.event_id,
- sender = original_message.sender,
- body = formatted_or_plain_body(&content.formatted, &content.body),
- )
- }
- MessageType::ServerNotice(content) => {
- formatdoc!(
- "
-
-
- In reply to
- {sender}
-
- {body}
-
-
- ",
- room_id = original_message.room_id,
- event_id = original_message.event_id,
- sender = original_message.sender,
- body = content.body,
- )
- }
- MessageType::Text(content) => {
- formatdoc!(
- "
-
-
- In reply to
- {sender}
-
- {body}
-
-
- ",
- room_id = original_message.room_id,
- event_id = original_message.event_id,
- sender = original_message.sender,
- body = formatted_or_plain_body(&content.formatted, &content.body),
- )
- }
- MessageType::Video(_) => {
- formatdoc!(
- "
-
-
- In reply to
- {sender}
-
- sent a video.
-
-
- ",
- room_id = original_message.room_id,
- event_id = original_message.event_id,
- sender = original_message.sender,
- )
- }
- MessageType::_Custom(content) => {
- formatdoc!(
- "
-
-
- In reply to
- {sender}
-
- {body}
-
-
- ",
- room_id = original_message.room_id,
- event_id = original_message.event_id,
- sender = original_message.sender,
- body = content.body,
- )
- }
- #[cfg(feature = "unstable-pre-spec")]
- MessageType::VerificationRequest(content) => {
- formatdoc!(
- "
-
-
- In reply to
- {sender}
-
- {body}
-
-
- ",
- server_name = original_message.room_id,
- event_id = original_message.event_id,
- sender = original_message.sender,
- body = content.body,
- )
- }
- }
-}
-
-fn formatted_or_plain_body<'a>(formatted: &'a Option, body: &'a str) -> &'a str {
- if let Some(formatted_body) = formatted {
- &formatted_body.body
- } else {
- body
- }
-}
-
#[cfg(test)]
mod tests {
- use std::convert::TryFrom;
-
use matches::assert_matches;
- use ruma_identifiers::{event_id, EventId, RoomId, UserId};
+ use ruma_identifiers::event_id;
use serde_json::{from_value as from_json_value, json};
- use super::{InReplyTo, MessageType, Relation, RoomMessageEvent, RoomMessageEventContent};
+ use super::{InReplyTo, MessageType, Relation, RoomMessageEventContent};
#[test]
fn deserialize_reply() {
@@ -1259,20 +1009,4 @@ mod tests {
} if event_id == ev_id
);
}
-
- #[test]
- fn plain_quote_fallback_multiline() {
- let sender = UserId::try_from("@alice:example.com").unwrap();
- assert_eq!(
- super::get_plain_quote_fallback(&RoomMessageEvent {
- content: RoomMessageEventContent::text_plain("multi\nline"),
- event_id: EventId::new(sender.server_name()),
- sender,
- origin_server_ts: ruma_common::MilliSecondsSinceUnixEpoch::now(),
- room_id: RoomId::try_from("!n8f893n9:example.com").unwrap(),
- unsigned: crate::Unsigned::new(),
- }),
- "> <@alice:example.com> multi\n> line"
- );
- }
}
diff --git a/crates/ruma-events/src/room/message/reply.rs b/crates/ruma-events/src/room/message/reply.rs
new file mode 100644
index 00000000..4547ec36
--- /dev/null
+++ b/crates/ruma-events/src/room/message/reply.rs
@@ -0,0 +1,277 @@
+use indoc::formatdoc;
+
+use super::{FormattedBody, MessageType, RoomMessageEvent};
+
+pub fn get_plain_quote_fallback(original_message: &RoomMessageEvent) -> String {
+ match &original_message.content.msgtype {
+ MessageType::Audio(_) => {
+ format!("> <{:?}> sent an audio file.", original_message.sender)
+ }
+ MessageType::Emote(content) => {
+ format!("> * <{:?}> {}", original_message.sender, content.body)
+ }
+ MessageType::File(_) => {
+ format!("> <{:?}> sent a file.", original_message.sender)
+ }
+ MessageType::Image(_) => {
+ format!("> <{:?}> sent an image.", original_message.sender)
+ }
+ MessageType::Location(content) => {
+ format!("> <{:?}> {}", original_message.sender, content.body)
+ }
+ MessageType::Notice(content) => {
+ format!("> <{:?}> {}", original_message.sender, content.body)
+ }
+ MessageType::ServerNotice(content) => {
+ format!("> <{:?}> {}", original_message.sender, content.body)
+ }
+ MessageType::Text(content) => {
+ format!("> <{:?}> {}", original_message.sender, content.body)
+ }
+ MessageType::Video(_) => {
+ format!("> <{:?}> sent a video.", original_message.sender)
+ }
+ MessageType::_Custom(content) => {
+ format!("> <{:?}> {}", original_message.sender, content.body)
+ }
+ #[cfg(feature = "unstable-pre-spec")]
+ MessageType::VerificationRequest(content) => {
+ format!("> <{:?}> {}", original_message.sender, content.body)
+ }
+ }
+ .replace('\n', "\n> ")
+}
+
+#[allow(clippy::nonstandard_macro_braces)]
+pub fn get_html_quote_fallback(original_message: &RoomMessageEvent) -> String {
+ match &original_message.content.msgtype {
+ MessageType::Audio(_) => {
+ formatdoc!(
+ "
+
+
+ In reply to
+ {sender}
+
+ sent an audio file.
+
+
+ ",
+ room_id = original_message.room_id,
+ event_id = original_message.event_id,
+ sender = original_message.sender,
+ )
+ }
+ MessageType::Emote(content) => {
+ formatdoc!(
+ "
+
+
+ In reply to
+ * {sender}
+
+ {body}
+
+
+ ",
+ room_id = original_message.room_id,
+ event_id = original_message.event_id,
+ sender = original_message.sender,
+ body = formatted_or_plain_body(&content.formatted, &content.body),
+ )
+ }
+ MessageType::File(_) => {
+ formatdoc!(
+ "
+
+
+ In reply to
+ {sender}
+
+ sent a file.
+
+
+ ",
+ room_id = original_message.room_id,
+ event_id = original_message.event_id,
+ sender = original_message.sender,
+ )
+ }
+ MessageType::Image(_) => {
+ formatdoc!(
+ "
+
+
+ In reply to
+ {sender}
+
+ sent an image.
+
+
+ ",
+ room_id = original_message.room_id,
+ event_id = original_message.event_id,
+ sender = original_message.sender,
+ )
+ }
+ MessageType::Location(_) => {
+ formatdoc!(
+ "
+
+
+ In reply to
+ {sender}
+
+ sent a location.
+
+
+ ",
+ room_id = original_message.room_id,
+ event_id = original_message.event_id,
+ sender = original_message.sender,
+ )
+ }
+ MessageType::Notice(content) => {
+ formatdoc!(
+ "
+
+
+ In reply to
+ {sender}
+
+ {body}
+
+
+ ",
+ room_id = original_message.room_id,
+ event_id = original_message.event_id,
+ sender = original_message.sender,
+ body = formatted_or_plain_body(&content.formatted, &content.body),
+ )
+ }
+ MessageType::ServerNotice(content) => {
+ formatdoc!(
+ "
+
+
+ In reply to
+ {sender}
+
+ {body}
+
+
+ ",
+ room_id = original_message.room_id,
+ event_id = original_message.event_id,
+ sender = original_message.sender,
+ body = content.body,
+ )
+ }
+ MessageType::Text(content) => {
+ formatdoc!(
+ "
+
+
+ In reply to
+ {sender}
+
+ {body}
+
+
+ ",
+ room_id = original_message.room_id,
+ event_id = original_message.event_id,
+ sender = original_message.sender,
+ body = formatted_or_plain_body(&content.formatted, &content.body),
+ )
+ }
+ MessageType::Video(_) => {
+ formatdoc!(
+ "
+
+
+ In reply to
+ {sender}
+
+ sent a video.
+
+
+ ",
+ room_id = original_message.room_id,
+ event_id = original_message.event_id,
+ sender = original_message.sender,
+ )
+ }
+ MessageType::_Custom(content) => {
+ formatdoc!(
+ "
+
+
+ In reply to
+ {sender}
+
+ {body}
+
+
+ ",
+ room_id = original_message.room_id,
+ event_id = original_message.event_id,
+ sender = original_message.sender,
+ body = content.body,
+ )
+ }
+ #[cfg(feature = "unstable-pre-spec")]
+ MessageType::VerificationRequest(content) => {
+ formatdoc!(
+ "
+
+
+ In reply to
+ {sender}
+
+ {body}
+
+
+ ",
+ server_name = original_message.room_id,
+ event_id = original_message.event_id,
+ sender = original_message.sender,
+ body = content.body,
+ )
+ }
+ }
+}
+
+fn formatted_or_plain_body<'a>(formatted: &'a Option, body: &'a str) -> &'a str {
+ if let Some(formatted_body) = formatted {
+ &formatted_body.body
+ } else {
+ body
+ }
+}
+
+#[cfg(test)]
+mod tests {
+ use std::convert::TryFrom;
+
+ use ruma_identifiers::{EventId, RoomId, UserId};
+
+ use super::RoomMessageEvent;
+ use crate::room::message::RoomMessageEventContent;
+
+ #[test]
+ fn plain_quote_fallback_multiline() {
+ let sender = UserId::try_from("@alice:example.com").unwrap();
+ assert_eq!(
+ super::get_plain_quote_fallback(&RoomMessageEvent {
+ content: RoomMessageEventContent::text_plain("multi\nline"),
+ event_id: EventId::new(sender.server_name()),
+ sender,
+ origin_server_ts: ruma_common::MilliSecondsSinceUnixEpoch::now(),
+ room_id: RoomId::try_from("!n8f893n9:example.com").unwrap(),
+ unsigned: crate::Unsigned::new(),
+ }),
+ "> <@alice:example.com> multi\n> line"
+ );
+ }
+}