use abscissa_core::Config;
use rustsec::{
advisory,
platforms::target::{Arch, OS},
report,
};
use serde::{Deserialize, Serialize};
use std::path::PathBuf;
#[derive(Clone, Config, Debug, Default, Deserialize, Serialize)]
#[serde(deny_unknown_fields)]
pub struct AuditConfig {
pub advisories: AdvisoryConfig,
pub database: DatabaseConfig,
pub output: OutputConfig,
pub target: TargetConfig,
}
impl AuditConfig {
pub fn report_settings(&self) -> report::Settings {
let mut settings = rustsec::report::Settings::default();
settings.ignore = self.advisories.ignore.clone();
settings.severity = self.advisories.severity_threshold;
settings.target_arch = self.target.arch;
settings.target_os = self.target.os;
if let Some(informational_warnings) = &self.advisories.informational_warnings {
settings.informational_warnings = informational_warnings.clone();
} else {
settings.informational_warnings = vec![advisory::Informational::Unmaintained];
}
settings
}
}
#[derive(Clone, Config, Debug, Default, Deserialize, Serialize)]
#[serde(deny_unknown_fields)]
pub struct AdvisoryConfig {
#[serde(default)]
pub ignore: Vec<advisory::Id>,
pub informational_warnings: Option<Vec<advisory::Informational>>,
pub severity_threshold: Option<advisory::Severity>,
}
#[derive(Clone, Config, Debug, Default, Deserialize, Serialize)]
#[serde(deny_unknown_fields)]
pub struct DatabaseConfig {
pub path: Option<PathBuf>,
pub url: Option<String>,
pub fetch: bool,
pub stale: bool,
}
#[derive(Clone, Config, Debug, Default, Deserialize, Serialize)]
#[serde(deny_unknown_fields)]
pub struct OutputConfig {
pub color: Option<String>,
#[serde(default)]
pub deny_warnings: bool,
#[serde(default)]
pub format: OutputFormat,
pub quiet: bool,
pub show_tree: Option<bool>,
}
impl OutputConfig {
pub fn is_quiet(&self) -> bool {
self.quiet || self.format == OutputFormat::Json
}
}
#[derive(Copy, Clone, Config, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub enum OutputFormat {
#[serde(rename = "json")]
Json,
#[serde(rename = "terminal")]
Terminal,
}
impl Default for OutputFormat {
fn default() -> Self {
OutputFormat::Terminal
}
}
#[derive(Clone, Config, Debug, Default, Deserialize, Serialize)]
#[serde(deny_unknown_fields)]
pub struct TargetConfig {
pub arch: Option<Arch>,
pub os: Option<OS>,
}