t_rust_less_lib/block_store/
model.rs

1use itertools::Itertools;
2use serde::{Deserialize, Serialize};
3
4#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)]
5#[serde(rename_all = "lowercase")]
6pub enum Operation {
7  Add,
8  Delete,
9}
10
11#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)]
12pub struct Change {
13  pub op: Operation,
14  pub block: String,
15}
16
17impl Change {
18  pub fn new<T: Into<String>>(op: Operation, block: T) -> Change {
19    Change {
20      op,
21      block: block.into(),
22    }
23  }
24}
25
26#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)]
27pub struct ChangeLog {
28  pub node: String,
29  pub changes: Vec<Change>,
30}
31
32impl ChangeLog {
33  pub fn new<T: Into<String>>(node: T) -> ChangeLog {
34    ChangeLog {
35      node: node.into(),
36      changes: vec![],
37    }
38  }
39
40  pub fn changes_since(&self, maybe_change: Option<&Change>) -> impl Iterator<Item = &Change> {
41    let skip = maybe_change
42      .and_then(|change| self.changes.iter().position(|c| c == change).map(|pos| pos + 1))
43      .unwrap_or(0);
44
45    self.changes.iter().dropping(skip)
46  }
47}