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}