summaryrefslogtreecommitdiff
path: root/src/user/history.rs
diff options
context:
space:
mode:
authorOwen Jacobson <owen@grimoire.ca>2025-04-03 23:45:23 -0400
committerOwen Jacobson <owen@grimoire.ca>2025-04-03 23:45:23 -0400
commit9f7f82dbd9adee8ae18ae7ff2600b3e1dc8fadbc (patch)
treed973d00486ffab3445e3ca454e93a941ed8fe6e2 /src/user/history.rs
parent24755a89a97a4d1cb10ebbcf41e200861f3bedf3 (diff)
parent45eea07a56022f647b3a273798a5255cda73f13d (diff)
Merge branch 'prop/rename-login-to-user'
Diffstat (limited to 'src/user/history.rs')
-rw-r--r--src/user/history.rs52
1 files changed, 52 insertions, 0 deletions
diff --git a/src/user/history.rs b/src/user/history.rs
new file mode 100644
index 0000000..ae7a561
--- /dev/null
+++ b/src/user/history.rs
@@ -0,0 +1,52 @@
+use super::{
+ Id, User,
+ event::{Created, Event},
+};
+use crate::event::{Instant, Sequence};
+
+#[derive(Clone, Debug, Eq, PartialEq)]
+pub struct History {
+ pub user: User,
+ pub created: Instant,
+}
+
+// State interface
+impl History {
+ pub fn id(&self) -> &Id {
+ &self.user.id
+ }
+
+ // Snapshot of this user as it was when created. (Note to the future: it's okay
+ // if this returns a redacted or modified version of the user. If we implement
+ // renames by redacting the original name, then this should return the edited
+ // user, not the original, even if that's not how it was "as created.")
+ pub fn as_created(&self) -> User {
+ self.user.clone()
+ }
+
+ pub fn as_of(&self, resume_point: Sequence) -> Option<User> {
+ self.events()
+ .filter(Sequence::up_to(resume_point))
+ .collect()
+ }
+
+ // Snapshot of this user, as of all events recorded in this history.
+ pub fn as_snapshot(&self) -> Option<User> {
+ self.events().collect()
+ }
+}
+
+// Events interface
+impl History {
+ fn created(&self) -> Event {
+ Created {
+ instant: self.created,
+ user: self.user.clone(),
+ }
+ .into()
+ }
+
+ pub fn events(&self) -> impl Iterator<Item = Event> + use<> {
+ [self.created()].into_iter()
+ }
+}