use crate::config::Config;
use crate::error::Result;
use crate::grouper::DuplicateGroup;
use crate::suppression::baseline_file::BaselineFile;
use crate::suppression::baseline_file::baseline_path;
use crate::suppression::baseline_kind::BaselineKind;
pub struct BaselineFilter {
recorded: Option<BaselineFile>,
}
impl BaselineFilter {
pub fn load(config: &Config) -> Result<Self> {
let Some(configured) = config.baseline.as_deref() else {
return Ok(Self { recorded: None });
};
let path = baseline_path(&config.root, Some(configured));
Ok(Self {
recorded: Some(BaselineFile::load(&path)?),
})
}
#[must_use]
pub const fn none() -> Self {
Self { recorded: None }
}
#[must_use]
pub const fn is_in_effect(&self) -> bool {
self.recorded.is_some()
}
#[must_use]
pub fn retain_new(
&self,
kind: BaselineKind,
groups: Vec<DuplicateGroup>,
) -> Vec<DuplicateGroup> {
let Some(recorded) = self.recorded.as_ref() else {
return groups;
};
groups
.into_iter()
.filter(|group| !recorded.admits(kind, group))
.collect()
}
}