use clap::{Parser, ValueEnum};
use std::path::PathBuf;
use crate::models::{DetailLevel, DocConfig, GroupBy, SortMethod};
#[derive(Parser, Debug)]
#[command(name = "vimanam", version)]
#[command(about = "OpenAPI to Markdown documentation generator", long_about = None)]
pub struct Cli {
#[arg(value_name = "FILE")]
pub input: PathBuf,
#[arg(short, long, value_name = "FILE")]
pub output: Option<PathBuf>,
#[arg(long)]
pub method: bool,
#[arg(long, value_enum, default_value = "service")]
pub group_by: Option<GroupByArg>,
#[arg(long)]
pub flat: bool,
#[arg(long, value_delimiter = ',')]
pub service_filter: Option<Vec<String>>,
#[arg(long)]
pub path_filter: Option<String>,
#[arg(long, value_delimiter = ',')]
pub method_filter: Option<Vec<String>>,
#[arg(long)]
pub exclude_deprecated: bool,
#[arg(long)]
pub required_only: bool,
#[arg(long, value_enum, default_value = "summary")]
pub detail: DetailLevelArg,
#[arg(long)]
pub include_schemas: bool,
#[arg(long)]
pub include_examples: bool,
#[arg(long)]
pub include_auth: bool,
#[arg(long)]
pub no_toc: bool,
#[arg(long, value_enum, default_value = "alpha")]
pub sort: SortArg,
}
#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, ValueEnum, Debug)]
pub enum GroupByArg {
Service,
Method,
}
#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, ValueEnum, Debug)]
pub enum DetailLevelArg {
Summary,
Basic,
Standard,
Full,
}
#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, ValueEnum, Debug)]
pub enum SortArg {
Alpha,
PathLength,
None,
}
impl From<GroupByArg> for GroupBy {
fn from(arg: GroupByArg) -> Self {
match arg {
GroupByArg::Service => GroupBy::Service,
GroupByArg::Method => GroupBy::Method,
}
}
}
impl From<DetailLevelArg> for DetailLevel {
fn from(arg: DetailLevelArg) -> Self {
match arg {
DetailLevelArg::Summary => DetailLevel::Summary,
DetailLevelArg::Basic => DetailLevel::Basic,
DetailLevelArg::Standard => DetailLevel::Standard,
DetailLevelArg::Full => DetailLevel::Full,
}
}
}
impl From<SortArg> for SortMethod {
fn from(arg: SortArg) -> Self {
match arg {
SortArg::Alpha => SortMethod::Alphabetical,
SortArg::PathLength => SortMethod::PathLength,
SortArg::None => SortMethod::None,
}
}
}
pub fn build_config(cli: &Cli) -> DocConfig {
let group_by = if cli.flat {
GroupBy::Flat
} else if cli.method {
GroupBy::Method
} else if let Some(group_by) = cli.group_by {
group_by.into()
} else {
GroupBy::Service
};
DocConfig {
group_by,
service_filter: cli.service_filter.clone(),
path_filter: cli.path_filter.clone(),
method_filter: cli.method_filter.clone(),
exclude_deprecated: cli.exclude_deprecated,
required_only: cli.required_only,
detail_level: cli.detail.into(),
include_schemas: cli.include_schemas,
include_examples: cli.include_examples,
include_auth: cli.include_auth,
include_toc: !cli.no_toc,
sort_method: cli.sort.into(),
}
}