use super::{ event::{Event, Kind, Sent}, Id, }; use crate::{channel::Channel, event::Instant, login::Login}; #[derive(Clone, Debug, Eq, PartialEq, serde::Serialize)] pub struct Message { #[serde(skip)] pub sent: Instant, pub channel: Channel, pub sender: Login, pub id: Id, pub body: String, } impl Message { fn apply(state: Option, event: Event) -> Option { match (state, event.kind) { (None, Kind::Sent(event)) => Some(event.into()), (Some(message), Kind::Deleted(event)) if message.id == event.id => None, (state, event) => panic!("invalid message event {event:#?} for state {state:#?}"), } } } impl FromIterator for Option { fn from_iter>(events: I) -> Self { events.into_iter().fold(None, Message::apply) } } impl From<&Sent> for Message { fn from(event: &Sent) -> Self { event.message.clone() } } impl From for Message { fn from(event: Sent) -> Self { event.message } }