use super::{ event::{Created, Event}, Id, Login, }; use crate::event::{Instant, Sequence}; #[derive(Clone, Debug, Eq, PartialEq)] pub struct History { pub login: Login, pub created: Instant, } // State interface impl History { pub fn id(&self) -> &Id { &self.login.id } // Snapshot of this login as it was when created. (Note to the future: it's okay // if this returns a redacted or modified version of the login. If we implement // renames by redacting the original name, then this should return the edited // login, not the original, even if that's not how it was "as created.") pub fn as_created(&self) -> Login { self.login.clone() } pub fn as_of(&self, resume_point: Sequence) -> Option { self.events() .filter(Sequence::up_to(resume_point)) .collect() } // Snapshot of this login, as of all events recorded in this history. pub fn as_snapshot(&self) -> Option { self.events().collect() } } // Events interface impl History { fn created(&self) -> Event { Created { instant: self.created, login: self.login.clone(), } .into() } pub fn events(&self) -> impl Iterator { [self.created()].into_iter() } }