1use crate::types::Config;
2use clap::{Args, Parser};
3use std::num::NonZeroUsize;
4use std::path::PathBuf;
5
6#[derive(Debug, Parser)]
7#[command(
8 name = "cargo-ff",
9 bin_name = "cargo ff",
10 about = "Fast Format is a fast drop-in replacement for cargo fmt",
11 version
12)]
13#[non_exhaustive]
14pub struct Cli {
15 #[arg(long)]
17 pub check: bool,
18
19 #[arg(long)]
23 pub all: bool,
24
25 #[arg(short = 'p', long = "package")]
27 pub packages: Vec<String>,
28
29 #[arg(long)]
31 pub manifest_path: Option<PathBuf>,
32
33 #[arg(last = true)]
35 pub rustfmt_args: Vec<String>,
36
37 #[command(flatten)]
38 pub ff: FfArgs,
39}
40
41#[derive(Debug, Args)]
44#[non_exhaustive]
45pub struct FfArgs {
46 #[arg(long = "ff-workers")]
48 pub workers: Option<NonZeroUsize>,
49
50 #[arg(long = "ff-channel-capacity", hide = true)]
52 pub channel_capacity: Option<usize>,
53
54 #[arg(long = "ff-batch-size", hide = true)]
57 pub batch_size: Option<usize>,
58
59 #[arg(long = "ff-experimental-cache", hide = true)]
63 pub experimental_cache: bool,
64
65 #[arg(long = "ff-warnings")]
67 pub warnings: bool,
68}
69
70impl Cli {
71 #[must_use]
73 pub fn parse_argv() -> Self {
74 let mut args: Vec<std::ffi::OsString> = std::env::args_os().collect();
75 if args.len() >= 2 && args[1] == "ff" {
76 args.remove(1);
77 }
78 Self::parse_from(args)
79 }
80
81 pub fn into_config(self) -> Config {
82 Config {
83 manifest_path: self.manifest_path,
84 packages: self.packages,
85 all: self.all,
86 check: self.check,
87 rustfmt_args: self.rustfmt_args,
88 workers: self.ff.workers.map(NonZeroUsize::get),
89 channel_capacity: self.ff.channel_capacity,
90 batch_size: self.ff.batch_size,
91 experimental_cache: self.ff.experimental_cache,
92 warnings: self.ff.warnings,
93 }
94 }
95}