cargo-crap4rust 0.6.2

Cargo subcommand for computing CRAP scores across Rust crates
Documentation
// Copyright 2025 Umberto Gotti <umberto.gotti@umbertogotti.dev>
// Licensed under the MIT License or Apache License, Version 2.0
// SPDX-License-Identifier: MIT OR Apache-2.0

use std::path::PathBuf;

use clap::{Parser, ValueEnum};

#[derive(Debug, Clone, Parser)]
#[command(name = "crap4rust")]
#[command(about = "Compute CRAP scores for Rust functions")]
pub struct Args {
    #[arg(long)]
    pub coverage: Option<PathBuf>,
    #[arg(long)]
    pub manifest_path: Option<PathBuf>,
    #[arg(long)]
    pub package: Vec<String>,
    #[arg(long)]
    pub features: Option<String>,
    #[arg(long, default_value_t = false)]
    pub all_features: bool,
    #[arg(long, default_value_t = false)]
    pub no_default_features: bool,
    #[arg(long, default_value_t = false)]
    pub include_test_targets: bool,
    #[arg(long)]
    pub exclude_path: Vec<String>,
    #[arg(long, default_value_t = 30.0)]
    pub threshold: f64,
    #[arg(long, default_value_t = 5.0)]
    pub project_threshold: f64,
    #[arg(long, default_value_t = false)]
    pub strict: bool,
    #[arg(long, default_value_t = false)]
    pub warn_only: bool,
    #[arg(long, default_value_t = 20.0)]
    pub warn_threshold: f64,
    #[arg(long, default_value_t = OutputFormat::Human, value_enum)]
    pub output_format: OutputFormat,
}

#[derive(Debug, Clone, Copy, PartialEq, Eq, ValueEnum)]
pub enum OutputFormat {
    Human,
    Json,
}

impl Args {
    pub fn parse_args() -> Self {
        Self::parse()
    }

    pub fn parse_from_args<I, T>(args: I) -> Self
    where
        I: IntoIterator<Item = T>,
        T: Into<std::ffi::OsString> + Clone,
    {
        Self::parse_from(args)
    }
}