Skip to main content

icydb_core/patch/
set.rs

1use candid::CandidType;
2use serde::{Deserialize, Serialize};
3
4///
5/// SetPatch
6///
7/// Set operations applied in-order; `Overwrite` replaces the entire set.
8///
9
10#[derive(CandidType, Clone, Debug, Deserialize, Serialize)]
11pub enum SetPatch<U> {
12    Insert(U),
13    Remove(U),
14    Overwrite { values: Vec<U> },
15    Clear,
16}
17
18///
19/// TESTS
20///
21
22#[cfg(test)]
23mod tests {
24    use super::*;
25    use crate::traits::UpdateView;
26    use std::collections::HashSet;
27
28    #[test]
29    fn set_insert_remove_without_clear() {
30        let mut set: HashSet<u8> = [1, 2, 3].into_iter().collect();
31        let patches = vec![SetPatch::Remove(2), SetPatch::Insert(4)];
32
33        set.merge(patches).expect("set patch merge should succeed");
34        let expected: HashSet<u8> = [1, 3, 4].into_iter().collect();
35        assert_eq!(set, expected);
36    }
37
38    #[test]
39    fn set_overwrite_replaces_contents() {
40        let mut set: HashSet<u8> = [1, 2, 3].into_iter().collect();
41        let patches = vec![SetPatch::Overwrite {
42            values: vec![3u8, 4, 5],
43        }];
44
45        set.merge(patches).expect("set patch merge should succeed");
46        let expected: HashSet<u8> = [3, 4, 5].into_iter().collect();
47        assert_eq!(set, expected);
48    }
49}