1use candid::CandidType;
2use serde::{Deserialize, Serialize};
3
4#[derive(CandidType, Clone, Debug, Deserialize, Serialize)]
15pub enum ListPatch<U> {
16 Update { index: usize, patch: U },
17 Insert { index: usize, value: U },
18 Push { value: U },
19 Overwrite { values: Vec<U> },
20 Remove { index: usize },
21 Clear,
22}
23
24#[cfg(test)]
29mod tests {
30 use super::*;
31 use crate::traits::UpdateView;
32
33 #[test]
34 fn vec_partial_patches() {
35 let mut values = vec![10u8, 20, 30];
36 let patches = vec![
37 ListPatch::Update {
38 index: 1,
39 patch: 99,
40 },
41 ListPatch::Insert {
42 index: 1,
43 value: 11,
44 },
45 ListPatch::Remove { index: 0 },
46 ];
47
48 values
49 .merge(patches)
50 .expect("list patch merge should succeed");
51
52 assert_eq!(values, vec![11, 99, 30]);
53 }
54
55 #[test]
56 fn vec_overwrite_replaces_contents() {
57 let mut values = vec![1u8, 2, 3];
58 let patches = vec![ListPatch::Overwrite {
59 values: vec![9u8, 8],
60 }];
61
62 values
63 .merge(patches)
64 .expect("list patch merge should succeed");
65
66 assert_eq!(values, vec![9, 8]);
67 }
68}