use super::{snapshot::Message, Id}; use crate::{ channel::Channel, event::{Instant, Sequenced}, }; #[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 { Sent(Sent), Deleted(Deleted), } impl Sequenced for Kind { fn instant(&self) -> Instant { match self { Self::Sent(sent) => sent.instant(), Self::Deleted(deleted) => deleted.instant(), } } } #[derive(Clone, Debug, Eq, PartialEq, serde::Serialize)] pub struct Sent { #[serde(flatten)] pub message: Message, } impl Sequenced for Sent { fn instant(&self) -> Instant { self.message.sent } } impl From for Kind { fn from(event: Sent) -> Self { Self::Sent(event) } } #[derive(Clone, Debug, Eq, PartialEq, serde::Serialize)] pub struct Deleted { #[serde(flatten)] pub instant: Instant, pub channel: Channel, pub message: Id, } impl Sequenced for Deleted { fn instant(&self) -> Instant { self.instant } } impl From for Kind { fn from(event: Deleted) -> Self { Self::Deleted(event) } }