t_rust_less_lib/block_store/
model.rs1use 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}