diff options
| author | Owen Jacobson <owen@grimoire.ca> | 2024-10-08 22:43:22 -0400 |
|---|---|---|
| committer | Owen Jacobson <owen@grimoire.ca> | 2024-10-09 11:45:31 -0400 |
| commit | 9e171096a72d3e63626df7b09970476aba28eb06 (patch) | |
| tree | 7272c065fdb85148dc5c90d937fc7d13fc716ccf /src/message | |
| parent | 653e2de752a97e377fc9963ba60d9408e7089528 (diff) | |
Use a two-tier hierarchy for events.
This will make it much easier to slot in new event types (login events!).
Diffstat (limited to 'src/message')
| -rw-r--r-- | src/message/event.rs | 22 | ||||
| -rw-r--r-- | src/message/history.rs | 14 | ||||
| -rw-r--r-- | src/message/snapshot.rs | 10 |
3 files changed, 16 insertions, 30 deletions
diff --git a/src/message/event.rs b/src/message/event.rs index 712ecc1..9f49a32 100644 --- a/src/message/event.rs +++ b/src/message/event.rs @@ -5,25 +5,13 @@ use crate::{ }; #[derive(Clone, Debug, Eq, PartialEq, serde::Serialize)] -pub struct Event { - #[serde(flatten)] - pub kind: Kind, -} - -impl Sequenced for Event { - fn instant(&self) -> Instant { - self.kind.instant() - } -} - -#[derive(Clone, Debug, Eq, PartialEq, serde::Serialize)] -#[serde(tag = "type", rename_all = "snake_case")] -pub enum Kind { +#[serde(tag = "event", rename_all = "snake_case")] +pub enum Event { Sent(Sent), Deleted(Deleted), } -impl Sequenced for Kind { +impl Sequenced for Event { fn instant(&self) -> Instant { match self { Self::Sent(sent) => sent.instant(), @@ -44,7 +32,7 @@ impl Sequenced for Sent { } } -impl From<Sent> for Kind { +impl From<Sent> for Event { fn from(event: Sent) -> Self { Self::Sent(event) } @@ -64,7 +52,7 @@ impl Sequenced for Deleted { } } -impl From<Deleted> for Kind { +impl From<Deleted> for Event { fn from(event: Deleted) -> Self { Self::Deleted(event) } diff --git a/src/message/history.rs b/src/message/history.rs index 3c3f77a..b5886af 100644 --- a/src/message/history.rs +++ b/src/message/history.rs @@ -35,22 +35,20 @@ impl History { // Events interface impl History { fn sent(&self) -> Event { - Event { - kind: Sent { - message: self.message.clone(), - } - .into(), + Sent { + message: self.message.clone(), } + .into() } fn deleted(&self) -> Option<Event> { - self.deleted.map(|instant| Event { - kind: Deleted { + self.deleted.map(|instant| { + Deleted { instant, channel: self.message.channel.clone(), id: self.message.id.clone(), } - .into(), + .into() }) } diff --git a/src/message/snapshot.rs b/src/message/snapshot.rs index a06fbc4..a8cf734 100644 --- a/src/message/snapshot.rs +++ b/src/message/snapshot.rs @@ -1,12 +1,12 @@ use super::{ - event::{Event, Kind, Sent}, + event::{Event, Sent}, Id, }; use crate::{channel::Channel, event::Instant, login::Login}; #[derive(Clone, Debug, Eq, PartialEq, serde::Serialize)] pub struct Message { - #[serde(skip)] + #[serde(flatten)] pub sent: Instant, pub channel: Channel, pub sender: Login, @@ -16,9 +16,9 @@ pub struct Message { impl Message { fn apply(state: Option<Self>, event: Event) -> Option<Self> { - match (state, event.kind) { - (None, Kind::Sent(event)) => Some(event.into()), - (Some(message), Kind::Deleted(event)) if message.id == event.id => None, + match (state, event) { + (None, Event::Sent(event)) => Some(event.into()), + (Some(message), Event::Deleted(event)) if message.id == event.id => None, (state, event) => panic!("invalid message event {event:#?} for state {state:#?}"), } } |
