// Native command-line arguments. Currently mirrors the old `MANDEL_*` debug // env vars one-for-one; this is the foundation a future headless (no-window, // render-to-file) mode will build on. use clap::{Parser, ValueEnum}; use crate::fractal::FractalKind; #[derive(Parser, Debug, Default)] #[command(name = "mandelbrot", about = "Deep-zoom fractal explorer", version)] pub struct Cli { /// Fractal formula to render. #[arg(long, value_enum)] pub kind: Option, /// Exponent for the Multibrot kind (z -> z^power + c), clamped to [2, 8]. #[arg(long)] pub power: Option, /// Start in Julia mode with this seed constant. #[arg(long, value_name = "RE,IM")] pub julia: Option, /// Restore a view from a share-link fragment (the part after '#'). #[arg(long, value_name = "FRAGMENT")] pub share: Option, /// Jump to a view on startup. #[arg(long, value_name = "RE,IM,HALF_HEIGHT[,ITERATIONS]")] pub view: Option, /// Enable distance-estimation shading. #[arg(long)] pub de: bool, /// Switch to the Buddhabrot renderer. #[arg(long)] pub buddhabrot: bool, /// Buddhabrot tonemap palette index. #[arg(long, value_name = "INDEX")] pub buddha_palette: Option, /// Render a PNG export on startup. #[arg(long)] pub export: bool, /// Output path for --export/--headless (default: fractal-.png). #[arg(long, value_name = "PATH")] pub export_path: Option, /// Run without opening a window: render the current view to a PNG and /// exit. Combine with --kind/--julia/--share/--view etc. to pick what to /// render. Not yet supported with --buddhabrot. #[arg(long)] pub headless: bool, /// Output image width in pixels (--headless only). #[arg(long, value_name = "PX", default_value_t = 1920)] pub width: u32, /// Output image height in pixels (--headless only). #[arg(long, value_name = "PX", default_value_t = 1080)] pub height: u32, } #[derive(Copy, Clone, Debug, ValueEnum)] pub enum KindArg { Mandelbrot, #[value(alias = "ship")] BurningShip, #[value(alias = "mandelbar")] Tricorn, #[value(alias = "multi")] Multibrot, Celtic, #[value(alias = "perp")] Perpendicular, Buffalo, Phoenix, Lambda, } impl From for FractalKind { fn from(k: KindArg) -> Self { match k { KindArg::Mandelbrot => FractalKind::Mandelbrot, KindArg::BurningShip => FractalKind::BurningShip, KindArg::Tricorn => FractalKind::Tricorn, KindArg::Multibrot => FractalKind::Multibrot, KindArg::Celtic => FractalKind::Celtic, KindArg::Perpendicular => FractalKind::Perpendicular, KindArg::Buffalo => FractalKind::Buffalo, KindArg::Phoenix => FractalKind::Phoenix, KindArg::Lambda => FractalKind::Lambda, } } }