use std::process::Command;

use anyhow::Result;

use crate::{bail_on_err, Clippy};

pub fn run(args: &Clippy) -> Result<()> {
    let mut clippy_command = Command::new("cargo");
    clippy_command.arg("+nightly").arg("clippy");

    if let Some(package) = args.package.as_ref() {
        clippy_command.args(["--package", package]);
    } else {
        clippy_command.arg("--workspace");
    }

    clippy_command
        .arg("--release")
        .arg("--all-targets")
        .arg("--all-features")
        .arg("--")
        .arg("-D")
        .arg("warnings");

    if args.fix {
        clippy_command.arg("--fix");
    }

    bail_on_err(
        &clippy_command.spawn()?.wait_with_output()?,
        "Clippy failed",
    )
}
