Skip to main content

icydb_core/patch/
set.rs

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