use clap::{Parser, Subcommand};
use std::path::PathBuf;
#[derive(Parser, Debug, Clone)]
pub struct GlobalOpts {
#[arg(long, global = true)]
pub spec: Option<String>,
#[arg(long, global = true)]
pub env: Option<String>,
#[arg(long, global = true)]
pub profile: Option<String>,
#[arg(long, global = true, value_enum)]
pub output: Option<OutputFormat>,
#[arg(long, global = true)]
pub select: Option<String>,
#[arg(long, global = true)]
pub no_color: bool,
#[arg(long, short, global = true)]
pub quiet: bool,
#[arg(long, short, global = true)]
pub verbose: bool,
#[arg(long, global = true)]
pub trace: bool,
#[arg(long, short, global = true)]
pub yes: bool,
}
#[derive(Clone, Debug, PartialEq, Eq, clap::ValueEnum)]
pub enum OutputFormat {
Json,
Yaml,
Table,
Pretty,
}
pub mod exit_codes {
pub const SUCCESS: i32 = 0;
pub const UNKNOWN_ERROR: i32 = 1;
pub const USAGE_ERROR: i32 = 2;
pub const AUTH_ERROR: i32 = 3;
pub const NETWORK_ERROR: i32 = 4;
pub const RATE_LIMIT_ERROR: i32 = 5;
pub const SERVER_ERROR: i32 = 6;
pub const VALIDATION_ERROR: i32 = 7;
pub const BREAKING_CHANGE: i32 = 8;
}
#[derive(Parser)]
#[command(name = "mrapids")]
#[command(about = "Your OpenAPI, but executable", long_about = None)]
#[command(version)]
pub struct Args {
#[command(subcommand)]
pub command: Commands,
#[command(flatten)]
pub global: GlobalOpts,
}
#[derive(Subcommand)]
pub enum Commands {
Init(InitCommand),
Config(ConfigCommand),
Cleanup(CleanupCommand),
Validate(ValidateCommand),
Resolve(ResolveCommand),
Diff(DiffCommand),
List(ListCommand),
Show(ShowCommand),
Search(SearchCommand),
Run(RunCommand),
Test(TestCommand),
Tests(TestsCommand),
Gen(GenCommand),
Auth(AuthCommand),
Help(HelpCommand),
}
#[derive(Parser)]
pub struct InitCommand {
#[arg(default_value = "my-api-project")]
pub name: String,
#[arg(long, value_name = "URL", conflicts_with = "from_file")]
pub from: Option<String>,
#[arg(long, value_name = "FILE", conflicts_with = "from")]
pub from_file: Option<String>,
#[arg(long, default_value = "rest")]
pub template: String,
#[arg(long)]
pub force: bool,
}
#[derive(Parser)]
pub struct ConfigCommand {
#[command(subcommand)]
pub action: Option<ConfigAction>,
}
#[derive(Subcommand)]
pub enum ConfigAction {
Set {
key: String,
value: String,
#[arg(long)]
env: Option<String>,
},
Get {
key: String,
#[arg(long)]
env: Option<String>,
},
List,
Edit {
#[arg(long)]
env: Option<String>,
},
}
#[derive(Parser)]
pub struct CleanupCommand {
#[arg(long)]
pub cache: bool,
#[arg(long)]
pub logs: bool,
#[arg(long)]
pub all: bool,
#[arg(long)]
pub keep_config: bool,
#[arg(long)]
pub dry_run: bool,
}
#[derive(Parser)]
pub struct ValidateCommand {
pub spec: Option<PathBuf>,
#[arg(long)]
pub strict: bool,
#[arg(long)]
pub lint: bool,
#[arg(long)]
pub rules: Option<PathBuf>,
#[arg(long, value_enum)]
pub format: Option<ValidateFormat>,
#[arg(long)]
pub fail_on: Option<String>,
}
#[derive(Clone, Debug, PartialEq, Eq, clap::ValueEnum)]
pub enum ValidateFormat {
Text,
Json,
}
#[derive(Parser)]
pub struct ResolveCommand {
pub spec: Option<PathBuf>,
#[arg(long)]
pub bundle: bool,
#[arg(long)]
pub external_only: bool,
#[arg(long, short)]
pub output: Option<PathBuf>,
#[arg(long)]
pub path: Option<String>,
#[arg(long)]
pub validate: bool,
}
#[derive(Parser)]
pub struct DiffCommand {
pub spec1: PathBuf,
pub spec2: PathBuf,
#[arg(long)]
pub breaking: bool,
#[arg(long, value_enum)]
pub format: Option<DiffFormat>,
#[arg(long)]
pub ignore_descriptions: bool,
#[arg(long)]
pub fail_on: Option<String>,
}
#[derive(Clone, Debug, PartialEq, Eq, clap::ValueEnum)]
pub enum DiffFormat {
Text,
Json,
Markdown,
}
#[derive(Parser)]
pub struct ListCommand {
#[command(subcommand)]
pub resource: ListResource,
}
#[derive(Subcommand)]
pub enum ListResource {
Operations {
spec: Option<PathBuf>,
#[arg(long)]
filter: Vec<String>,
},
Schemas {
spec: Option<PathBuf>,
#[arg(long)]
filter: Vec<String>,
},
Examples {
spec: Option<PathBuf>,
},
Requests,
}
#[derive(Parser)]
pub struct ShowCommand {
pub name: String,
pub spec: Option<PathBuf>,
#[arg(long, default_value = "operation")]
pub r#type: String,
#[arg(long)]
pub examples: bool,
#[arg(long)]
pub verbose: bool,
}
#[derive(Parser)]
pub struct SearchCommand {
pub keyword: String,
pub spec: Option<PathBuf>,
#[arg(long)]
pub in_descriptions: bool,
#[arg(long)]
pub case_sensitive: bool,
#[arg(long, value_delimiter = ',')]
pub r#in: Vec<String>,
}
#[derive(Parser)]
pub struct RunCommand {
pub spec: Option<PathBuf>,
#[arg(long, group = "operation_select")]
pub op_id: Option<String>,
#[arg(long, requires = "method", group = "operation_select")]
pub path: Option<String>,
#[arg(long, requires = "path")]
pub method: Option<String>,
#[arg(long = "param", value_name = "KEY=VALUE")]
pub params: Vec<String>,
#[arg(long)]
pub body: Option<PathBuf>,
#[arg(long)]
pub dry_run: bool,
#[arg(long)]
pub curl_output: bool,
}
#[derive(Parser)]
pub struct TestCommand {
pub spec: Option<PathBuf>,
#[arg(long)]
pub op_id: Option<String>,
#[arg(long)]
pub all: bool,
#[arg(long)]
pub from: Option<PathBuf>,
#[arg(long)]
pub validate: bool,
#[arg(long)]
pub load: Option<u32>,
#[arg(long)]
pub concurrent: Option<u32>,
#[arg(long)]
pub report: Option<PathBuf>,
#[arg(long)]
pub format: Option<TestFormat>,
#[arg(long)]
pub fail_on: Option<String>,
}
#[derive(Clone, Debug, PartialEq, Eq, clap::ValueEnum)]
pub enum TestFormat {
Text,
Json,
Junit,
}
#[derive(Parser)]
pub struct TestsCommand {
#[command(subcommand)]
pub action: TestsAction,
}
#[derive(Subcommand)]
pub enum TestsAction {
Init {
spec: Option<PathBuf>,
#[arg(long)]
framework: Option<String>,
#[arg(long)]
with_ci: Option<String>,
#[arg(long, short)]
output: Option<PathBuf>,
},
}
#[derive(Parser)]
pub struct GenCommand {
#[command(subcommand)]
pub target: GenTarget,
}
#[derive(Subcommand)]
pub enum GenTarget {
Snippets {
spec: Option<PathBuf>,
#[arg(long)]
op_id: Option<String>,
#[arg(long, value_enum)]
format: Option<SnippetFormat>,
#[arg(long, short)]
output: Option<PathBuf>,
},
Sdk {
spec: Option<PathBuf>,
#[arg(long, value_delimiter = ',')]
lang: Vec<String>,
#[arg(long)]
package: Option<String>,
#[arg(long)]
with_docs: bool,
#[arg(long)]
template: Option<PathBuf>,
},
Stubs {
spec: Option<PathBuf>,
#[arg(long)]
framework: String,
#[arg(long)]
with_tests: bool,
#[arg(long, short)]
output: Option<PathBuf>,
},
Fixtures {
spec: Option<PathBuf>,
#[arg(long)]
schema: Vec<String>,
#[arg(long)]
count: Option<u32>,
#[arg(long)]
seed: Option<u64>,
#[arg(long, value_enum)]
format: Option<FixtureFormat>,
},
}
#[derive(Clone, Debug, PartialEq, Eq, clap::ValueEnum)]
pub enum SnippetFormat {
Curl,
Httpie,
Fetch,
Axios,
Requests,
}
#[derive(Clone, Debug, PartialEq, Eq, clap::ValueEnum)]
pub enum FixtureFormat {
Json,
Yaml,
}
#[derive(Parser)]
pub struct AuthCommand {
#[command(subcommand)]
pub action: AuthAction,
}
#[derive(Subcommand)]
pub enum AuthAction {
Login {
provider: String,
#[arg(long)]
scopes: Option<String>,
#[arg(long)]
auth_url: Option<String>,
},
Logout {
provider: Option<String>,
#[arg(long)]
all: bool,
#[arg(long)]
force: bool,
},
Status {
provider: Option<String>,
#[arg(long)]
test: bool,
},
}
#[derive(Parser)]
pub struct HelpCommand {
pub command: Option<String>,
}