runmat_package/lock/
diff.rs1use super::PackageLock;
2use crate::ContentDigest;
3use std::collections::BTreeSet;
4
5#[derive(Debug, Clone, PartialEq, Eq, Default)]
6pub struct LockDiff {
7 pub added: BTreeSet<ContentDigest>,
8 pub removed: BTreeSet<ContentDigest>,
9 pub selection_changed: bool,
10 pub root_changed: bool,
11}
12
13impl LockDiff {
14 pub fn is_empty(&self) -> bool {
15 self.added.is_empty()
16 && self.removed.is_empty()
17 && !self.selection_changed
18 && !self.root_changed
19 }
20}
21
22pub fn diff_locks(before: &PackageLock, after: &PackageLock) -> LockDiff {
23 let before_instances = before
24 .packages
25 .iter()
26 .map(|package| package.instance.identity_digest.clone())
27 .collect::<BTreeSet<_>>();
28 let after_instances = after
29 .packages
30 .iter()
31 .map(|package| package.instance.identity_digest.clone())
32 .collect::<BTreeSet<_>>();
33 LockDiff {
34 added: after_instances
35 .difference(&before_instances)
36 .cloned()
37 .collect(),
38 removed: before_instances
39 .difference(&after_instances)
40 .cloned()
41 .collect(),
42 selection_changed: before.selection != after.selection,
43 root_changed: before.root != after.root,
44 }
45}