Skip to main content

runmat_package/lock/
diff.rs

1use 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}