openapi_snapshot/
cli.rs

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}