use serde_with::with_prefix; use super::{ Id, event::{Created, Event}, }; use crate::{event::Instant, name::Name}; #[derive(Clone, Debug, Eq, PartialEq, serde::Serialize)] pub struct Conversation { #[serde(flatten)] pub created: Instant, pub id: Id, pub name: Name, #[serde( flatten, with = "prefix_deleted", skip_serializing_if = "Option::is_none" )] pub deleted: Option, } with_prefix!(prefix_deleted "deleted_"); impl Conversation { fn apply(state: Option, event: Event) -> Option { match (state, event) { (None, Event::Created(event)) => Some(event.into()), (Some(conversation), Event::Deleted(event)) if conversation.id == event.id => None, (state, event) => panic!("invalid conversation event {event:#?} for state {state:#?}"), } } } impl FromIterator for Option { fn from_iter>(events: I) -> Self { events.into_iter().fold(None, Conversation::apply) } } impl From<&Created> for Conversation { fn from(event: &Created) -> Self { event.conversation.clone() } } impl From for Conversation { fn from(event: Created) -> Self { event.conversation } }