summaryrefslogtreecommitdiff
path: root/src/events/types.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/events/types.rs')
-rw-r--r--src/events/types.rs40
1 files changed, 38 insertions, 2 deletions
diff --git a/src/events/types.rs b/src/events/types.rs
index 6747afc..7c0e0a4 100644
--- a/src/events/types.rs
+++ b/src/events/types.rs
@@ -11,6 +11,7 @@ use crate::{
#[derive(
Debug,
+ Default,
Eq,
Ord,
PartialEq,
@@ -59,7 +60,30 @@ impl ResumePoint {
let Self(elements) = self;
elements.get(channel).copied()
}
+
+ pub fn not_after(&self, event: impl ResumeElement) -> bool {
+ let Self(elements) = self;
+ let (channel, sequence) = event.element();
+
+ elements
+ .get(channel)
+ .map_or(true, |resume_at| resume_at < &sequence)
+ }
}
+
+pub trait ResumeElement {
+ fn element(&self) -> (&channel::Id, Sequence);
+}
+
+impl<T> ResumeElement for &T
+where
+ T: ResumeElement,
+{
+ fn element(&self) -> (&channel::Id, Sequence) {
+ (*self).element()
+ }
+}
+
#[derive(Clone, Debug)]
pub struct ResumableEvent(pub ResumePoint, pub ChannelEvent);
@@ -74,14 +98,26 @@ pub struct ChannelEvent {
}
impl ChannelEvent {
- pub fn sequence(&self) -> ResumePoint {
- ResumePoint::singleton(&self.channel.id, self.sequence)
+ pub fn created(channel: Channel) -> Self {
+ Self {
+ at: channel.created_at,
+ sequence: Sequence::default(),
+ channel,
+ data: ChannelEventData::Created,
+ }
+ }
+}
+
+impl ResumeElement for ChannelEvent {
+ fn element(&self) -> (&channel::Id, Sequence) {
+ (&self.channel.id, self.sequence)
}
}
#[derive(Clone, Debug, Eq, PartialEq, serde::Serialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum ChannelEventData {
+ Created,
Message(MessageEvent),
}