Skip to main content

cargo_compatible/
cli.rs

1use clap::{Args, Parser, Subcommand, ValueEnum};
2use std::path::PathBuf;
3
4const AFTER_HELP: &str = "\
5Examples:
6  cargo compatible scan --workspace
7  cargo compatible scan --package my-crate --format json
8  cargo compatible resolve --rust-version 1.70
9  cargo compatible resolve --write-candidate .cargo-compatible/candidate/Cargo.lock
10  cargo compatible apply-lock --candidate-lockfile .cargo-compatible/candidate/Cargo.lock
11  cargo compatible suggest-manifest --package my-crate
12  cargo compatible explain serde";
13
14#[derive(Parser, Debug)]
15#[command(name = "cargo-compatible", bin_name = "cargo compatible", version, after_help = AFTER_HELP)]
16pub struct Cli {
17    #[command(subcommand)]
18    pub command: Commands,
19}
20
21#[derive(Subcommand, Debug)]
22pub enum Commands {
23    Scan(ScanCommand),
24    Resolve(ResolveCommand),
25    ApplyLock(ApplyLockCommand),
26    SuggestManifest(SuggestManifestCommand),
27    Explain(ExplainCommand),
28}
29
30#[derive(Copy, Clone, Debug, Eq, PartialEq, ValueEnum)]
31pub enum OutputFormat {
32    Human,
33    Json,
34    Markdown,
35}
36
37#[derive(Args, Debug, Clone)]
38pub struct SelectionArgs {
39    #[arg(long)]
40    pub manifest_path: Option<PathBuf>,
41    #[arg(long)]
42    pub rust_version: Option<String>,
43    #[arg(long)]
44    pub workspace: bool,
45    #[arg(
46        long = "package",
47        short = 'p',
48        help = "Select workspace members by exact package name, package ID, or manifest path"
49    )]
50    pub package: Vec<String>,
51}
52
53#[derive(Args, Debug)]
54pub struct ScanCommand {
55    #[command(flatten)]
56    pub selection: SelectionArgs,
57    #[arg(long, value_enum, default_value = "human")]
58    pub format: OutputFormat,
59}
60
61#[derive(Args, Debug, Clone)]
62pub struct ResolveCommand {
63    #[command(flatten)]
64    pub selection: SelectionArgs,
65    #[arg(long, value_enum, default_value = "human")]
66    pub format: OutputFormat,
67    #[arg(long = "write-candidate")]
68    pub write_candidate: Option<PathBuf>,
69    #[arg(
70        long,
71        help = "Write the rendered resolve report using the selected --format"
72    )]
73    pub write_report: Option<PathBuf>,
74}
75
76#[derive(Args, Debug)]
77pub struct ApplyLockCommand {
78    #[arg(long)]
79    pub manifest_path: Option<PathBuf>,
80    #[arg(long)]
81    pub candidate_lockfile: Option<PathBuf>,
82}
83
84#[derive(Args, Debug)]
85pub struct SuggestManifestCommand {
86    #[command(flatten)]
87    pub selection: SelectionArgs,
88    #[arg(long)]
89    pub allow_major: bool,
90    #[arg(long)]
91    pub write_manifests: bool,
92    #[arg(long, value_enum, default_value = "human")]
93    pub format: OutputFormat,
94}
95
96#[derive(Args, Debug)]
97pub struct ExplainCommand {
98    #[command(flatten)]
99    pub selection: SelectionArgs,
100    #[arg(value_name = "CRATE-OR-PKGID")]
101    pub query: String,
102    #[arg(long, value_enum, default_value = "human")]
103    pub format: OutputFormat,
104}