use dev_report::{CheckResult, Producer, Report, Severity};
use crate::AuditRun;
pub struct AuditProducer {
run: AuditRun,
}
impl AuditProducer {
pub fn new(run: AuditRun) -> Self {
Self { run }
}
pub fn run(&self) -> &AuditRun {
&self.run
}
}
impl Producer for AuditProducer {
fn produce(&self) -> Report {
let subject = self.run.subject().to_string();
let version = self.run.subject_version().to_string();
match self.run.execute() {
Ok(result) => result.into_report(),
Err(e) => {
let mut report = Report::new(&subject, &version).with_producer("dev-security");
let check = CheckResult::fail("security::audit", Severity::Critical)
.with_detail(e.to_string())
.with_tag("security")
.with_tag("subprocess");
report.push(check);
report.finish();
report
}
}
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::AuditScope;
#[test]
fn produce_returns_report_when_tool_missing() {
let producer =
AuditProducer::new(AuditRun::new("self", "0.0.0").scope(AuditScope::Vulnerabilities));
let report = producer.produce();
assert_eq!(report.subject, "self");
assert!(!report.checks.is_empty());
}
}