pub mod app; mod routes; use crate::{ channel, event::{Instant, Sequence}, login::Login, message, }; pub use self::routes::router; #[derive(serde::Serialize)] pub struct Snapshot { pub resume_point: Sequence, pub channels: Vec, } #[derive(serde::Serialize)] pub struct Channel { pub id: channel::Id, pub name: String, pub messages: Vec, } impl Channel { fn new( channel: channel::Channel, messages: impl IntoIterator, ) -> Self { // The declarations are like this to guarantee that we aren't omitting any important fields from the corresponding types. let channel::Channel { id, name } = channel; Self { id, name, messages: messages.into_iter().map(Message::from).collect(), } } } #[derive(serde::Serialize)] pub struct Message { #[serde(flatten)] pub sent: Instant, pub sender: Login, // Named this way for serialization reasons #[allow(clippy::struct_field_names)] pub message: Body, } impl From for Message { fn from(message: message::Message) -> Self { let message::Message { sent, channel: _, sender, id, body, } = message; Self { sent, sender, message: Body { id, body }, } } } #[derive(serde::Serialize)] pub struct Body { id: message::Id, body: String, }