matrix_sdk_base/
latest_event.rs1use matrix_sdk_common::deserialized_responses::TimelineEvent;
4use ruma::MilliSecondsSinceUnixEpoch;
5use serde::{Deserialize, Serialize};
6
7use crate::store::SerializableEventContent;
8
9#[derive(Debug, Default, Clone, Serialize, Deserialize)]
11pub enum LatestEventValue {
12 #[default]
14 None,
15
16 Remote(RemoteLatestEventValue),
18
19 LocalIsSending(LocalLatestEventValue),
21
22 LocalCannotBeSent(LocalLatestEventValue),
25}
26
27impl LatestEventValue {
28 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 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
61pub type RemoteLatestEventValue = TimelineEvent;
63
64#[derive(Debug, Clone, Serialize, Deserialize)]
67pub struct LocalLatestEventValue {
68 pub timestamp: MilliSecondsSinceUnixEpoch,
70
71 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}