ruma_events/room/
pinned_events.rs

1//! Types for the [`m.room.pinned_events`] event.
2//!
3//! [`m.room.pinned_events`]: https://spec.matrix.org/latest/client-server-api/#mroompinned_events
4
5use ruma_common::OwnedEventId;
6use ruma_macros::EventContent;
7use serde::{Deserialize, Serialize};
8
9use crate::EmptyStateKey;
10
11/// The content of an `m.room.pinned_events` event.
12///
13/// Used to "pin" particular events in a room for other participants to review later.
14#[derive(Clone, Debug, Deserialize, Serialize, EventContent)]
15#[cfg_attr(not(ruma_unstable_exhaustive_types), non_exhaustive)]
16#[ruma_event(type = "m.room.pinned_events", kind = State, state_key_type = EmptyStateKey)]
17pub struct RoomPinnedEventsEventContent {
18    /// An ordered list of event IDs to pin.
19    pub pinned: Vec<OwnedEventId>,
20}
21
22impl RoomPinnedEventsEventContent {
23    /// Creates a new `RoomPinnedEventsEventContent` with the given events.
24    pub fn new(pinned: Vec<OwnedEventId>) -> Self {
25        Self { pinned }
26    }
27}
28
29#[cfg(test)]
30mod tests {
31    use ruma_common::owned_event_id;
32
33    use super::RoomPinnedEventsEventContent;
34
35    #[test]
36    fn serialization_deserialization() {
37        let mut content: RoomPinnedEventsEventContent =
38            RoomPinnedEventsEventContent { pinned: Vec::new() };
39
40        content.pinned.push(owned_event_id!("$a:example.com"));
41        content.pinned.push(owned_event_id!("$b:example.com"));
42
43        let serialized = serde_json::to_string(&content).unwrap();
44        let parsed_content: RoomPinnedEventsEventContent =
45            serde_json::from_str(&serialized).unwrap();
46
47        assert_eq!(parsed_content.pinned, content.pinned);
48    }
49}