patchcov 0.4.1

Patch coverage for git diffs: attribute lcov, llvm-cov, Cobertura, Go and JaCoCo reports to a diff and gate on it.
Documentation
//! The `patchcov` command-line entry point.

use std::ffi::OsString;
use std::process::ExitCode;

use patchcov::cli::exit::{self, ErrorReport};
use patchcov::cli::warn;
use patchcov::cli::{usage_report, Cli, ErrorFormat, ERROR_FORMAT_ENV};

fn main() -> ExitCode {
    let args: Vec<OsString> = std::env::args_os().collect();
    let cli = match Cli::try_parse_args(&args) {
        Ok(cli) => cli,
        Err(err) => {
            let env = std::env::var_os(ERROR_FORMAT_ENV);
            return match usage_report(&err, &args, env.as_ref()) {
                Some(report) => {
                    eprintln!("{}", report.to_json());
                    ExitCode::from(report.code)
                }
                // Prints the message (or help) and exits with clap's own code.
                None => err.exit(),
            };
        }
    };
    let (error_format, warning) =
        cli.resolve_error_format(std::env::var_os(ERROR_FORMAT_ENV).as_deref());
    warn::set_format(error_format);
    if let Some(warning) = warning {
        eprintln!("warning: {warning}");
    }
    match cli.execute() {
        Ok(()) => ExitCode::SUCCESS,
        Err(err) => {
            match error_format {
                ErrorFormat::Text => eprintln!("Error: {err:#}"),
                ErrorFormat::Json => eprintln!("{}", ErrorReport::new(&err).to_json()),
            }
            ExitCode::from(exit::code(&err))
        }
    }
}