diff options
Diffstat (limited to 'src/conversation/history.rs')
| -rw-r--r-- | src/conversation/history.rs | 44 |
1 files changed, 39 insertions, 5 deletions
diff --git a/src/conversation/history.rs b/src/conversation/history.rs index 746a1b0..5cba9ca 100644 --- a/src/conversation/history.rs +++ b/src/conversation/history.rs @@ -4,13 +4,49 @@ use super::{ Conversation, Id, event::{Created, Deleted, Event}, }; -use crate::event::Sequence; +use crate::{ + event::{Instant, Sequence}, + name::Name, +}; #[derive(Clone, Debug, Eq, PartialEq)] pub struct History { pub conversation: Conversation, } +// Lifecycle interface +impl History { + pub fn begin(name: &Name, created: Instant) -> Self { + Self { + conversation: Conversation { + id: Id::generate(), + name: name.clone(), + created, + deleted: None, + }, + } + } + + pub fn delete(self, deleted: Instant) -> Result<Self, DeleteError> { + if self.conversation.deleted.is_none() { + Ok(Self { + conversation: Conversation { + deleted: Some(deleted), + ..self.conversation + }, + }) + } else { + Err(DeleteError::Deleted(self)) + } + } +} + +#[derive(Debug, thiserror::Error)] +pub enum DeleteError { + #[error("conversation {} already deleted", .0.conversation.id)] + Deleted(History), +} + // State interface impl History { pub fn id(&self) -> &Id { @@ -30,9 +66,7 @@ impl History { where S: Into<Sequence>, { - self.events() - .filter(Sequence::up_to(sequence.into())) - .collect() + self.events().filter(Sequence::up_to(sequence)).collect() } // Snapshot of this conversation as of all events recorded in this history. @@ -43,7 +77,7 @@ impl History { // Event factories impl History { - pub fn events(&self) -> impl Iterator<Item = Event> + use<> { + pub fn events(&self) -> impl Iterator<Item = Event> + Clone + use<> { [self.created()] .into_iter() .merge_by(self.deleted(), Sequence::merge) |
