use crate::{channel, message}; pub mod app; pub mod broadcaster; mod extract; pub mod repo; mod routes; mod sequence; pub use self::{ routes::router, sequence::{Instant, Sequence, Sequenced}, }; #[derive(Clone, Debug, Eq, PartialEq, serde::Serialize)] pub struct Event { #[serde(flatten)] pub instant: Instant, #[serde(flatten)] pub kind: Kind, } impl Sequenced for Event { fn instant(&self) -> Instant { self.instant } } impl From for Event { fn from(event: channel::Event) -> Self { Self { instant: event.instant, kind: event.kind.into(), } } } impl From for Event { fn from(event: message::Event) -> Self { Self { instant: event.instant(), kind: event.kind.into(), } } } #[derive(Clone, Debug, Eq, PartialEq, serde::Serialize)] #[serde(tag = "type", rename_all = "snake_case")] pub enum Kind { #[serde(rename = "created")] ChannelCreated(channel::event::Created), #[serde(rename = "message")] MessageSent(message::event::Sent), MessageDeleted(message::event::Deleted), #[serde(rename = "deleted")] ChannelDeleted(channel::event::Deleted), } impl From for Kind { fn from(kind: channel::event::Kind) -> Self { match kind { channel::event::Kind::Created(created) => Self::ChannelCreated(created), channel::event::Kind::Deleted(deleted) => Self::ChannelDeleted(deleted), } } } impl From for Kind { fn from(kind: message::event::Kind) -> Self { match kind { message::event::Kind::Sent(created) => Self::MessageSent(created), message::event::Kind::Deleted(deleted) => Self::MessageDeleted(deleted), } } }