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 pub fn is_date_divider(&self) -> bool {
111 matches!(self.kind, TimelineItemKind::Virtual(VirtualTimelineItem::DateDivider(_)))
112 }
113
114 pub(crate) fn is_read_marker(&self) -> bool {
115 matches!(self.kind, TimelineItemKind::Virtual(VirtualTimelineItem::ReadMarker))
116 }
117
118 pub fn is_timeline_start(&self) -> bool {
120 matches!(self.kind, TimelineItemKind::Virtual(VirtualTimelineItem::TimelineStart))
121 }
122}
123
124impl Deref for TimelineItem {
125 type Target = TimelineItemKind;
126
127 fn deref(&self) -> &Self::Target {
128 &self.kind
129 }
130}
131
132impl From<EventTimelineItem> for TimelineItemKind {
133 fn from(item: EventTimelineItem) -> Self {
134 Self::Event(item)
135 }
136}
137
138impl From<VirtualTimelineItem> for TimelineItemKind {
139 fn from(item: VirtualTimelineItem) -> Self {
140 Self::Virtual(item)
141 }
142}