1#![forbid(unsafe_code)]
2#![doc = include_str!("../README.md")]
3
4#[derive(Clone, Debug, Default, Eq, PartialEq)]
5pub struct EventLog<E> {
6 entries: Vec<E>,
7}
8
9impl<E> EventLog<E> {
10 pub const fn new() -> Self {
11 Self {
12 entries: Vec::new(),
13 }
14 }
15
16 pub fn append(&mut self, event: E) {
17 self.entries.push(event);
18 }
19
20 pub fn entries(&self) -> &[E] {
21 &self.entries
22 }
23
24 pub fn last(&self) -> Option<&E> {
25 self.entries.last()
26 }
27
28 pub fn len(&self) -> usize {
29 self.entries.len()
30 }
31
32 pub fn is_empty(&self) -> bool {
33 self.entries.is_empty()
34 }
35}
36
37#[cfg(test)]
38mod tests {
39 use super::EventLog;
40
41 #[test]
42 fn appends_entries_in_order() {
43 let mut log = EventLog::new();
44 log.append("command.started");
45 log.append("command.finished");
46
47 assert_eq!(log.entries(), ["command.started", "command.finished"]);
48 assert_eq!(log.last(), Some(&"command.finished"));
49 assert_eq!(log.len(), 2);
50 }
51
52 #[test]
53 fn starts_empty() {
54 let log = EventLog::<&str>::default();
55
56 assert!(log.is_empty());
57 }
58}