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