use clap::{Parser, Subcommand, ValueEnum};
use std::path::PathBuf;
#[derive(Parser)]
#[command(about = "Generate course dependency maps from Quarto/Markdown documents")]
#[command(version)]
#[command(subcommand_precedence_over_arg = true)]
pub struct Cli {
#[command(subcommand)]
pub command: Option<Commands>,
pub input: Option<PathBuf>,
#[arg(short, long, default_value = "course_map.svg")]
pub output: PathBuf,
#[arg(short, long, default_value = "svg")]
pub format: OutputFormat,
#[arg(short, long)]
pub config: Option<PathBuf>,
#[arg(short, long)]
pub verbose: bool,
}
#[derive(Subcommand)]
pub enum Commands {
#[command(name = "show-config")]
ShowConfig {
#[arg(short, long)]
config: Option<PathBuf>,
},
}
#[derive(Clone, ValueEnum)]
pub enum OutputFormat {
Svg,
Png,
Dot,
}
impl std::fmt::Display for OutputFormat {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
OutputFormat::Svg => write!(f, "svg"),
OutputFormat::Png => write!(f, "png"),
OutputFormat::Dot => write!(f, "dot"),
}
}
}
impl Cli {
pub fn parse_args() -> Self {
Self::parse()
}
pub fn input_dir(&self) -> Option<&str> {
self.input.as_ref().and_then(|p| p.to_str())
}
pub fn output_path(&self) -> &str {
self.output.to_str().unwrap_or("course_map.svg")
}
pub fn format_str(&self) -> String {
self.format.to_string()
}
}