1use clap::{Args, Parser, Subcommand, ValueEnum};
2use std::path::PathBuf;
3
4pub const DEFAULT_URL: &str = "http://localhost:3000/api-docs/openapi.json";
5pub const DEFAULT_OUT: &str = "openapi/backend_openapi.json";
6pub const DEFAULT_OUTLINE_OUT: &str = "openapi/backend_openapi.outline.json";
7pub const DEFAULT_REDUCE: &str = "paths,components";
8pub const DEFAULT_INTERVAL_MS: u64 = 2_000;
9
10#[derive(ValueEnum, Debug, Clone, Copy, PartialEq, Eq)]
11pub enum OutputProfile {
12 Full,
13 Outline,
14}
15
16#[derive(Parser, Debug)]
17#[command(
18 name = "openapi-snapshot",
19 version,
20 about = "Fetch and save an OpenAPI JSON snapshot.",
21 after_help = "Examples:\n openapi-snapshot\n openapi-snapshot watch\n openapi-snapshot --out openapi/backend_openapi.json --outline-out openapi/backend_openapi.outline.json\n openapi-snapshot --profile outline --out openapi/backend_openapi.outline.json\n openapi-snapshot --url http://localhost:3000/api-docs/openapi.json --out openapi/backend_openapi.json\n openapi-snapshot --minify true --out openapi/backend_openapi.min.json"
22)]
23pub struct Cli {
24 #[command(subcommand)]
25 pub command: Option<Command>,
26 #[command(flatten)]
27 pub common: CommonArgs,
28}
29
30#[derive(Subcommand, Debug)]
31pub enum Command {
32 Watch(WatchArgs),
33}
34
35#[derive(Args, Debug, Clone)]
36pub struct CommonArgs {
37 #[arg(long)]
38 pub url: Option<String>,
39 #[arg(long)]
40 pub out: Option<PathBuf>,
41 #[arg(long)]
42 pub outline_out: Option<PathBuf>,
43 #[arg(long)]
44 pub reduce: Option<String>,
45 #[arg(long, value_enum, default_value_t = OutputProfile::Full)]
46 pub profile: OutputProfile,
47 #[arg(
48 long,
49 default_value_t = false,
50 default_missing_value = "true",
51 num_args(0..=1),
52 value_parser = clap::builder::BoolishValueParser::new()
53 )]
54 pub minify: bool,
55 #[arg(long, default_value_t = 10_000)]
56 pub timeout_ms: u64,
57 #[arg(long)]
58 pub header: Vec<String>,
59 #[arg(long)]
60 pub stdout: bool,
61}
62
63#[derive(Args, Debug, Clone)]
64pub struct WatchArgs {
65 #[arg(long, default_value_t = DEFAULT_INTERVAL_MS)]
66 pub interval_ms: u64,
67 #[arg(long, default_value_t = false)]
68 pub no_outline: bool,
69}