vsec 0.0.1

Detect secrets and in Rust codebases
Documentation
// src/output/mod.rs

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;

/// Format findings using the specified format
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),
    }
}

/// Format findings as GitHub Actions annotations
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")
}