use clap::Parser; use std::num::NonZero; use std::path::PathBuf; #[derive(Clone, Debug, Parser)] pub(crate) struct LintcheckConfig { /// Number of threads to use (default: all unless --fix or --recursive) #[clap( long = "jobs", short = 'j', value_name = "N", default_value_t = 0, hide_default_value = true )] pub max_jobs: usize, /// Set the path for a crates.toml where lintcheck should read the sources from #[clap( long = "crates-toml", value_name = "CRATES-SOURCES-TOML-PATH", default_value = "lintcheck/lintcheck_crates.toml", hide_default_value = true, env = "LINTCHECK_TOML", hide_env = true )] pub sources_toml_path: PathBuf, /// File to save the clippy lint results here #[clap(skip = "")] pub lintcheck_results_path: PathBuf, // Overridden in new() /// Only process a single crate on the list #[clap(long, value_name = "CRATE")] pub only: Option, /// Runs cargo clippy --fix and checks if all suggestions apply #[clap(long, conflicts_with("max_jobs"))] pub fix: bool, /// Apply a filter to only collect specified lints, this also overrides `allow` attributes #[clap(long = "filter", value_name = "clippy_lint_name", use_value_delimiter = true)] pub lint_filter: Vec, /// Change the reports table to use markdown links #[clap(long)] pub markdown: bool, /// Run clippy on the dependencies of crates specified in crates-toml #[clap(long, conflicts_with("max_jobs"))] pub recursive: bool, } impl LintcheckConfig { pub fn new() -> Self { let mut config = LintcheckConfig::parse(); // for the path where we save the lint results, get the filename without extension (so for // wasd.toml, use "wasd"...) let filename: PathBuf = config.sources_toml_path.file_stem().unwrap().into(); config.lintcheck_results_path = PathBuf::from(format!( "lintcheck-logs/{}_logs.{}", filename.display(), if config.markdown { "md" } else { "txt" } )); // look at the --threads arg, if 0 is passed, use the threads count if config.max_jobs == 0 { config.max_jobs = if config.fix || config.recursive { 1 } else { std::thread::available_parallelism().map_or(1, NonZero::get) }; }; for lint_name in &mut config.lint_filter { *lint_name = format!( "clippy::{}", lint_name .strip_prefix("clippy::") .unwrap_or(lint_name) .replace('_', "-") ); } config } }