matrix_sdk_ui/timeline/
item.rs1use std::{ops::Deref, sync::Arc};
16
17use as_variant::as_variant;
18
19use super::{EventTimelineItem, VirtualTimelineItem};
20
21#[derive(Clone, Debug, PartialEq, Eq, Hash)]
27pub struct TimelineUniqueId(pub String);
28
29#[derive(Clone, Debug)]
31#[allow(clippy::large_enum_variant)]
32pub enum TimelineItemKind {
33 Event(EventTimelineItem),
35 Virtual(VirtualTimelineItem),
38}
39
40#[derive(Clone, Debug)]
42pub struct TimelineItem {
43 pub(crate) kind: TimelineItemKind,
44 pub(crate) internal_id: TimelineUniqueId,
45}
46
47impl TimelineItem {
48 pub(crate) fn new(
50 kind: impl Into<TimelineItemKind>,
51 internal_id: TimelineUniqueId,
52 ) -> Arc<Self> {
53 Arc::new(TimelineItem { kind: kind.into(), internal_id })
54 }
55
56 pub(crate) fn with_kind(&self, kind: impl Into<TimelineItemKind>) -> Arc<Self> {
58 Arc::new(Self { kind: kind.into(), internal_id: self.internal_id.clone() })
59 }
60
61 pub fn kind(&self) -> &TimelineItemKind {
63 &self.kind
64 }
65
66 pub fn as_event(&self) -> Option<&EventTimelineItem> {
69 as_variant!(&self.kind, TimelineItemKind::Event)
70 }
71
72 pub fn as_virtual(&self) -> Option<&VirtualTimelineItem> {
75 as_variant!(&self.kind, TimelineItemKind::Virtual)
76 }
77
78 pub fn unique_id(&self) -> &TimelineUniqueId {
87 &self.internal_id
88 }
89
90 pub(crate) fn read_marker() -> Arc<TimelineItem> {
91 Arc::new(Self {
92 kind: TimelineItemKind::Virtual(VirtualTimelineItem::ReadMarker),
93 internal_id: TimelineUniqueId("__read_marker".to_owned()),
94 })
95 }
96
97 pub(crate) fn is_local_echo(&self) -> bool {
98 matches!(&self.kind, TimelineItemKind::Event(ev) if ev.is_local_echo())
99 }
100
101 pub(crate) fn is_remote_event(&self) -> bool {
102 matches!(&self.kind, TimelineItemKind::Event(ev) if ev.is_remote_event())
103 }
104
105 pub(crate) fn is_event(&self) -> bool {
106 matches!(&self.kind, TimelineItemKind::Event(_))
107 }
108
109 #[must_use]
111 pub fn is_date_divider(&self) -> bool {
112 matches!(self.kind, TimelineItemKind::Virtual(VirtualTimelineItem::DateDivider(_)))
113 }
114
115 pub(crate) fn is_read_marker(&self) -> bool {
116 matches!(self.kind, TimelineItemKind::Virtual(VirtualTimelineItem::ReadMarker))
117 }
118}
119
120impl Deref for TimelineItem {
121 type Target = TimelineItemKind;
122
123 fn deref(&self) -> &Self::Target {
124 &self.kind
125 }
126}
127
128impl From<EventTimelineItem> for TimelineItemKind {
129 fn from(item: EventTimelineItem) -> Self {
130 Self::Event(item)
131 }
132}
133
134impl From<VirtualTimelineItem> for TimelineItemKind {
135 fn from(item: VirtualTimelineItem) -> Self {
136 Self::Virtual(item)
137 }
138}