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 {
86 &self.internal_id
87 }
88
89 pub(crate) fn read_marker() -> Arc<TimelineItem> {
90 Arc::new(Self {
91 kind: TimelineItemKind::Virtual(VirtualTimelineItem::ReadMarker),
92 internal_id: TimelineUniqueId("__read_marker".to_owned()),
93 })
94 }
95
96 pub(crate) fn is_local_echo(&self) -> bool {
97 matches!(&self.kind, TimelineItemKind::Event(ev) if ev.is_local_echo())
98 }
99
100 pub(crate) fn is_remote_event(&self) -> bool {
101 matches!(&self.kind, TimelineItemKind::Event(ev) if ev.is_remote_event())
102 }
103
104 pub(crate) fn is_event(&self) -> bool {
105 matches!(&self.kind, TimelineItemKind::Event(_))
106 }
107
108 pub fn is_date_divider(&self) -> bool {
110 matches!(self.kind, TimelineItemKind::Virtual(VirtualTimelineItem::DateDivider(_)))
111 }
112
113 pub(crate) fn is_read_marker(&self) -> bool {
114 matches!(self.kind, TimelineItemKind::Virtual(VirtualTimelineItem::ReadMarker))
115 }
116
117 pub fn is_timeline_start(&self) -> bool {
119 matches!(self.kind, TimelineItemKind::Virtual(VirtualTimelineItem::TimelineStart))
120 }
121}
122
123impl Deref for TimelineItem {
124 type Target = TimelineItemKind;
125
126 fn deref(&self) -> &Self::Target {
127 &self.kind
128 }
129}
130
131impl From<EventTimelineItem> for TimelineItemKind {
132 fn from(item: EventTimelineItem) -> Self {
133 Self::Event(item)
134 }
135}
136
137impl From<VirtualTimelineItem> for TimelineItemKind {
138 fn from(item: VirtualTimelineItem) -> Self {
139 Self::Virtual(item)
140 }
141}