use std::io;
use anyhow::Result;
use crate::{Severity, finding::Finding};
impl Severity {
fn as_github_command(&self) -> &str {
match self {
Severity::Informational => "notice",
Severity::Low => "warning",
Severity::Medium => "warning",
Severity::High => "error",
}
}
}
impl Finding<'_> {
fn format_command(&self, sink: &mut impl io::Write) -> Result<()> {
let primary = self.primary_location();
let filepath = primary.symbolic.key.sarif_path();
let start_line = primary.concrete.location.start_point.row + 1;
let title = self.ident;
let message = format!(
"{filename}:{start_line}: {desc}: {annotation}",
filename = primary.symbolic.key.filename(),
desc = self.desc,
annotation = primary.symbolic.annotation,
);
writeln!(
sink,
"::{} file={filepath},line={start_line},title={title}::{message}",
self.determinations.severity.as_github_command()
)?;
Ok(())
}
}
pub(crate) fn output(sink: impl io::Write, findings: &[Finding]) -> Result<()> {
let mut sink = sink;
for finding in findings {
finding.format_command(&mut sink)?;
}
Ok(())
}