matrix_sdk_base/
latest_event.rs

1//! The Latest Event basic types.
2
3use matrix_sdk_common::deserialized_responses::TimelineEvent;
4use ruma::MilliSecondsSinceUnixEpoch;
5use serde::{Deserialize, Serialize};
6
7use crate::store::SerializableEventContent;
8
9/// A latest event value!
10#[derive(Debug, Default, Clone, Serialize, Deserialize)]
11pub enum LatestEventValue {
12    /// No value has been computed yet, or no candidate value was found.
13    #[default]
14    None,
15
16    /// The latest event represents a remote event.
17    Remote(RemoteLatestEventValue),
18
19    /// The latest event represents a local event that is sending.
20    LocalIsSending(LocalLatestEventValue),
21
22    /// The latest event represents a local event that cannot be sent, either
23    /// because a previous local event, or this local event cannot be sent.
24    LocalCannotBeSent(LocalLatestEventValue),
25}
26
27impl LatestEventValue {
28    /// Get the timestamp of the [`LatestEventValue`].
29    ///
30    /// If it's [`None`], it returns `None`. If it's [`Remote`], it returns the
31    /// [`TimelineEvent::timestamp`]. If it's [`LocalIsSending`] or
32    /// [`LocalCannotBeSent`], it returns the
33    /// [`LocalLatestEventValue::timestamp`] value.
34    ///
35    /// [`None`]: LatestEventValue::None
36    /// [`Remote`]: LatestEventValue::Remote
37    /// [`LocalIsSending`]: LatestEventValue::LocalIsSending
38    /// [`LocalCannotBeSent`]: LatestEventValue::LocalCannotBeSent
39    pub fn timestamp(&self) -> Option<MilliSecondsSinceUnixEpoch> {
40        match self {
41            Self::None => None,
42            Self::Remote(remote_latest_event_value) => remote_latest_event_value.timestamp(),
43            Self::LocalIsSending(LocalLatestEventValue { timestamp, .. })
44            | Self::LocalCannotBeSent(LocalLatestEventValue { timestamp, .. }) => Some(*timestamp),
45        }
46    }
47
48    /// Check whether the [`LatestEventValue`] represents a local value or not,
49    /// i.e. it is [`LocalIsSending`] or [`LocalCannotBeSent`].
50    ///
51    /// [`LocalIsSending`]: LatestEventValue::LocalIsSending
52    /// [`LocalCannotBeSent`]: LatestEventValue::LocalCannotBeSent
53    pub fn is_local(&self) -> bool {
54        match self {
55            Self::LocalIsSending(_) | Self::LocalCannotBeSent(_) => true,
56            Self::None | Self::Remote(_) => false,
57        }
58    }
59}
60
61/// Represents the value for [`LatestEventValue::Remote`].
62pub type RemoteLatestEventValue = TimelineEvent;
63
64/// Represents the value for [`LatestEventValue::LocalIsSending`] and
65/// [`LatestEventValue::LocalCannotBeSent`].
66#[derive(Debug, Clone, Serialize, Deserialize)]
67pub struct LocalLatestEventValue {
68    /// The time where the event has been created (by this module).
69    pub timestamp: MilliSecondsSinceUnixEpoch,
70
71    /// The content of the local event.
72    pub content: SerializableEventContent,
73}
74
75#[cfg(test)]
76mod tests_latest_event_value {
77    use ruma::{
78        MilliSecondsSinceUnixEpoch,
79        events::{AnyMessageLikeEventContent, room::message::RoomMessageEventContent},
80        serde::Raw,
81        uint,
82    };
83    use serde_json::json;
84
85    use super::{LatestEventValue, LocalLatestEventValue, RemoteLatestEventValue};
86    use crate::store::SerializableEventContent;
87
88    #[test]
89    fn test_timestamp_with_none() {
90        let value = LatestEventValue::None;
91
92        assert_eq!(value.timestamp(), None);
93    }
94
95    #[test]
96    fn test_timestamp_with_remote() {
97        let value = LatestEventValue::Remote(RemoteLatestEventValue::from_plaintext(
98            Raw::from_json_string(
99                json!({
100                    "content": RoomMessageEventContent::text_plain("raclette"),
101                    "type": "m.room.message",
102                    "event_id": "$ev0",
103                    "room_id": "!r0",
104                    "origin_server_ts": 42,
105                    "sender": "@mnt_io:matrix.org",
106                })
107                .to_string(),
108            )
109            .unwrap(),
110        ));
111
112        assert_eq!(value.timestamp(), Some(MilliSecondsSinceUnixEpoch(uint!(42))));
113    }
114
115    #[test]
116    fn test_timestamp_with_local_is_sending() {
117        let value = LatestEventValue::LocalIsSending(LocalLatestEventValue {
118            timestamp: MilliSecondsSinceUnixEpoch(uint!(42)),
119            content: SerializableEventContent::new(&AnyMessageLikeEventContent::RoomMessage(
120                RoomMessageEventContent::text_plain("raclette"),
121            ))
122            .unwrap(),
123        });
124
125        assert_eq!(value.timestamp(), Some(MilliSecondsSinceUnixEpoch(uint!(42))));
126    }
127
128    #[test]
129    fn test_timestamp_with_local_cannot_be_sent() {
130        let value = LatestEventValue::LocalCannotBeSent(LocalLatestEventValue {
131            timestamp: MilliSecondsSinceUnixEpoch(uint!(42)),
132            content: SerializableEventContent::new(&AnyMessageLikeEventContent::RoomMessage(
133                RoomMessageEventContent::text_plain("raclette"),
134            ))
135            .unwrap(),
136        });
137
138        assert_eq!(value.timestamp(), Some(MilliSecondsSinceUnixEpoch(uint!(42))));
139    }
140}