use std::fmt::Write as _;
use std::path::Path;
use crate::analysis::AnalysisResult;
use crate::cli::cli_error::CliError;
use crate::cli::cli_error::CliResult;
use crate::cli::command_outcome::CommandOutcome;
use crate::config::Config;
use crate::suppression::baseline_file::BaselineFile;
use crate::suppression::baseline_file::baseline_path;
pub struct BaselineCommand<'a> {
root: &'a Path,
config: &'a Config,
result: &'a AnalysisResult,
dry_run: bool,
}
impl<'a> BaselineCommand<'a> {
#[must_use]
pub const fn new(
root: &'a Path,
config: &'a Config,
result: &'a AnalysisResult,
dry_run: bool,
) -> Self {
Self {
root,
config,
result,
dry_run,
}
}
pub fn run(&self) -> CliResult<CommandOutcome> {
let path = baseline_path(self.root, self.config.baseline.as_deref());
let recorded = BaselineFile::record(self.result);
let mut out = String::new();
for entry in &recorded.entries {
let _ = writeln!(
out,
" {} {} ({} members: {})",
entry.kind,
entry.fingerprint,
entry.members,
entry.names.join(", ")
);
}
if self.dry_run {
let _ = writeln!(
out,
"{} groups would be recorded in {}.",
recorded.len(),
path.display()
);
return Ok(CommandOutcome::succeeded(out));
}
if let Err(error) = recorded.save(&path) {
return Ok(CommandOutcome::new(out, Err(CliError::Analysis(error))));
}
let _ = writeln!(
out,
"Recorded {} groups in {}.",
recorded.len(),
path.display()
);
Ok(CommandOutcome::succeeded(out))
}
}