use std::collections::BTreeMap;
use std::io::Write;
use std::path::PathBuf;
use anyhow::Result;
use crate::analysis::findings::Finding;
use crate::analysis::result::FailureReason;
pub fn finding_line(source: Option<&str>, f: &Finding) -> String {
let column = f.column.map(|c| format!(":{c}")).unwrap_or_default();
let tag = match source {
Some(source) => format!("{source}/{}", f.kind),
None => f.kind.clone(),
};
format!(
"{}:{}{}: {} [{}] {}",
f.file_path,
f.line,
column,
f.severity.as_str(),
tag,
f.message
)
}
pub fn write_suggestion<W: Write>(out: &mut W, f: &Finding) -> Result<()> {
if let Some(suggestion) = &f.suggestion {
writeln!(out, " suggestion: {suggestion}")?;
}
Ok(())
}
pub fn write_failures<W: Write>(
out: &mut W,
failures: &BTreeMap<PathBuf, FailureReason>,
findings_above: bool,
) -> Result<()> {
if failures.is_empty() {
return Ok(());
}
if findings_above {
writeln!(out)?;
}
writeln!(out, "{} file(s) could not be analyzed:", failures.len())?;
for (path, reason) in failures {
writeln!(out, " {}: {}", path.display(), reason.one_line())?;
}
Ok(())
}