use serde::{Deserialize, Serialize};
use crate::{Capability, CapabilityFinding, CapabilityProfile};
#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq, Eq)]
pub struct CapabilityDiff {
pub added: Vec<CapabilityFinding>,
pub removed: Vec<CapabilityFinding>,
pub new_capabilities: Vec<Capability>,
pub dropped_capabilities: Vec<Capability>,
}
impl CapabilityDiff {
pub fn compute(old: &CapabilityProfile, new: &CapabilityProfile) -> Self {
let added: Vec<CapabilityFinding> = new
.findings
.iter()
.filter(|f| !old.findings.contains(f))
.cloned()
.collect();
let removed: Vec<CapabilityFinding> = old
.findings
.iter()
.filter(|f| !new.findings.contains(f))
.cloned()
.collect();
let old_caps = old.capabilities();
let new_caps = new.capabilities();
let new_capabilities: Vec<Capability> = new_caps
.iter()
.filter(|c| !old_caps.contains(c))
.copied()
.collect();
let dropped_capabilities: Vec<Capability> = old_caps
.iter()
.filter(|c| !new_caps.contains(c))
.copied()
.collect();
Self {
added,
removed,
new_capabilities,
dropped_capabilities,
}
}
}