pub mod formatter;
pub mod json;
pub mod markdown;
pub mod sarif;
pub mod text;
pub use formatter::{format_findings, OutputFormat};
pub use json::JsonFormatter;
pub use markdown::MarkdownFormatter;
pub use sarif::SarifFormatter;
pub use text::TextFormatter;
use crate::config::Config;
use crate::models::Finding;
pub fn format(findings: &[Finding], format: OutputFormat, config: &Config) -> String {
match format {
OutputFormat::Text => TextFormatter::new(config).format(findings),
OutputFormat::Json => JsonFormatter::new().format(findings),
OutputFormat::Sarif => SarifFormatter::new().format(findings),
OutputFormat::Markdown => MarkdownFormatter::new(config).format(findings),
OutputFormat::Github => format_github_annotations(findings),
}
}
fn format_github_annotations(findings: &[Finding]) -> String {
findings
.iter()
.map(|f| {
let level = match f.score.severity {
crate::models::Severity::Critical | crate::models::Severity::High => "error",
crate::models::Severity::Medium => "warning",
_ => "notice",
};
format!(
"::{} file={},line={},col={}::{}",
level,
f.location.file.display(),
f.location.line,
f.location.column,
f.explanation.replace('\n', "%0A")
)
})
.collect::<Vec<_>>()
.join("\n")
}