diff --git a/crates/ruma-client-api/CHANGELOG.md b/crates/ruma-client-api/CHANGELOG.md index 1339021e..f085934e 100644 --- a/crates/ruma-client-api/CHANGELOG.md +++ b/crates/ruma-client-api/CHANGELOG.md @@ -80,6 +80,7 @@ Breaking changes: } ``` * Change `r0::session::get_login_types::LoginType` to a non-exhaustive enum of structs. +* Move `r0::receipt::ReceiptType` to the `ruma-common` crate Improvements: diff --git a/crates/ruma-client-api/src/r0/receipt/create_receipt.rs b/crates/ruma-client-api/src/r0/receipt/create_receipt.rs index b7492fd8..f9bdbfab 100644 --- a/crates/ruma-client-api/src/r0/receipt/create_receipt.rs +++ b/crates/ruma-client-api/src/r0/receipt/create_receipt.rs @@ -1,8 +1,8 @@ //! [POST /_matrix/client/r0/rooms/{roomId}/receipt/{receiptType}/{eventId}](https://matrix.org/docs/spec/client_server/r0.6.0#post-matrix-client-r0-rooms-roomid-receipt-receipttype-eventid) use ruma_api::ruma_api; +use ruma_common::receipt::ReceiptType; use ruma_identifiers::{EventId, RoomId}; -use ruma_serde::{AsRefStr, DisplayAsRefStr, FromString}; ruma_api! { metadata: { @@ -47,14 +47,3 @@ impl Response { Self } } - -/// The type of receipt. -#[derive(Clone, Debug, AsRefStr, DisplayAsRefStr, FromString)] -pub enum ReceiptType { - /// m.read - #[ruma_enum(rename = "m.read")] - Read, - - #[doc(hidden)] - _Custom(String), -} diff --git a/crates/ruma-common/CHANGELOG.md b/crates/ruma-common/CHANGELOG.md index a106dfe7..df707a64 100644 --- a/crates/ruma-common/CHANGELOG.md +++ b/crates/ruma-common/CHANGELOG.md @@ -1,5 +1,9 @@ # [unreleased] +Improvements: + +* Add `receipt::ReceiptType` + # 0.5.0 Breaking changes: diff --git a/crates/ruma-common/src/lib.rs b/crates/ruma-common/src/lib.rs index 2d27eefa..873c9039 100644 --- a/crates/ruma-common/src/lib.rs +++ b/crates/ruma-common/src/lib.rs @@ -11,4 +11,5 @@ pub mod encryption; pub mod power_levels; pub mod presence; pub mod push; +pub mod receipt; pub mod thirdparty; diff --git a/crates/ruma-common/src/receipt.rs b/crates/ruma-common/src/receipt.rs new file mode 100644 index 00000000..519a985a --- /dev/null +++ b/crates/ruma-common/src/receipt.rs @@ -0,0 +1,14 @@ +//! Common types for receipts. + +use ruma_serde::StringEnum; + +/// The type of receipt. +#[derive(Clone, Debug, PartialOrd, Ord, PartialEq, Eq, StringEnum)] +pub enum ReceiptType { + /// m.read + #[ruma_enum(rename = "m.read")] + Read, + + #[doc(hidden)] + _Custom(String), +} diff --git a/crates/ruma-events/CHANGELOG.md b/crates/ruma-events/CHANGELOG.md index 3e300bdb..079931aa 100644 --- a/crates/ruma-events/CHANGELOG.md +++ b/crates/ruma-events/CHANGELOG.md @@ -42,6 +42,7 @@ Breaking changes: ``` * Add `tag::TagName` type and use it for `tag::Tags` * Move `FullyRead` from `EphemeralRoom` enum to `Basic` enum +* Change `receipt::Receipts` struct to a `BTreeMap` Improvements: diff --git a/crates/ruma-events/src/receipt.rs b/crates/ruma-events/src/receipt.rs index 651f1e4a..82faf80d 100644 --- a/crates/ruma-events/src/receipt.rs +++ b/crates/ruma-events/src/receipt.rs @@ -6,6 +6,7 @@ use std::{ time::SystemTime, }; +use ruma_common::receipt::ReceiptType; use ruma_events_macros::EphemeralRoomEventContent; use ruma_identifiers::{EventId, UserId}; use serde::{Deserialize, Serialize}; @@ -38,12 +39,7 @@ impl DerefMut for ReceiptEventContent { } /// A collection of receipts. -#[derive(Clone, Debug, Deserialize, Serialize)] -pub struct Receipts { - /// A collection of users who have sent *m.read* receipts for this event. - #[serde(default, rename = "m.read")] - pub read: Option, -} +pub type Receipts = BTreeMap; /// A mapping of user ID to receipt. /// diff --git a/crates/ruma-events/tests/ephemeral_event.rs b/crates/ruma-events/tests/ephemeral_event.rs index 4a8a66cd..ff2e9235 100644 --- a/crates/ruma-events/tests/ephemeral_event.rs +++ b/crates/ruma-events/tests/ephemeral_event.rs @@ -2,12 +2,13 @@ use std::time::{Duration, UNIX_EPOCH}; use maplit::btreemap; use matches::assert_matches; +use ruma_common::receipt::ReceiptType; use ruma_identifiers::{event_id, room_id, user_id}; use ruma_serde::Raw; use serde_json::{from_value as from_json_value, json, to_value as to_json_value}; use ruma_events::{ - receipt::{Receipt, ReceiptEventContent, Receipts}, + receipt::{Receipt, ReceiptEventContent}, typing::TypingEventContent, AnyEphemeralRoomEventContent, EphemeralRoomEvent, }; @@ -63,10 +64,10 @@ fn ephemeral_serialize_receipt() { let aliases_event = EphemeralRoomEvent { content: AnyEphemeralRoomEventContent::Receipt(ReceiptEventContent(btreemap! { - event_id => Receipts { - read: Some(btreemap! { + event_id => btreemap! { + ReceiptType::Read => btreemap! { user_id => Receipt { ts: Some(UNIX_EPOCH + Duration::from_millis(1)) }, - }), + }, }, })), room_id: room_id!("!roomid:room.com"), @@ -117,7 +118,7 @@ fn deserialize_ephemeral_receipt() { && room_id == room_id!("!roomid:room.com") && receipts .get(&event_id) - .map(|r| r.read.as_ref().unwrap().get(&user_id).unwrap()) + .map(|r| r.get(&ReceiptType::Read).unwrap().get(&user_id).unwrap()) .map(|r| r.ts) .unwrap() == Some(UNIX_EPOCH + Duration::from_millis(1))