Skip to main content

pedant_types/
profile.rs

1use serde::{Deserialize, Serialize};
2
3use crate::{Capability, CapabilityFinding};
4
5/// Aggregated capability findings for a crate or file.
6#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq, Eq)]
7pub struct CapabilityProfile {
8    /// Every capability finding, unsorted and possibly duplicated across files.
9    pub findings: Box<[CapabilityFinding]>,
10}
11
12impl CapabilityProfile {
13    /// Deduplicated, sorted capability set. Recomputes on each call -- cache if needed.
14    pub fn capabilities(&self) -> Box<[Capability]> {
15        let mut caps: Vec<Capability> = self.findings.iter().map(|f| f.capability).collect();
16        caps.sort();
17        caps.dedup();
18        caps.into_boxed_slice()
19    }
20
21    /// Iterate over findings matching a single capability type.
22    pub fn findings_for(&self, capability: Capability) -> impl Iterator<Item = &CapabilityFinding> {
23        self.findings
24            .iter()
25            .filter(move |f| f.capability == capability)
26    }
27}