mod gate;
mod output;
mod parse;
mod source;
use anyhow::Result;
use crate::cli::{CheckDiffArgs, DiffFormat};
use crate::exit::Code;
use gate::{Gate, Level};
use output::Report;
pub fn run(args: &CheckDiffArgs) -> Result<Code> {
let input = match &args.base {
Some(base) => source::from_git(
base,
args.head.as_deref().unwrap_or("HEAD"),
args.policy.as_deref(),
)?,
None => source::from_stdin(args.policy.as_deref())?,
};
let gate = Gate::new(&input.policy, &input.policy_files)?;
let mut findings = gate.check(&input.files);
findings.extend(input.unchecked);
let report = Report::new(
&findings,
input.files.len(),
&input.policy_source,
input.repo_policy.as_deref(),
);
output::write(args.format.unwrap_or_else(default_format), &report)?;
Ok(match output::worst(&findings) {
Some(Level::Deny) => Code::Deny,
Some(Level::Review) => Code::Review,
None => Code::Ok,
})
}
fn default_format() -> DiffFormat {
if std::env::var_os("GITHUB_ACTIONS").is_some_and(|v| v == "true") {
DiffFormat::Github
} else {
DiffFormat::Text
}
}
#[cfg(test)]
mod tests;