use clap::Parser;
use std::path::PathBuf;
#[derive(Parser, Debug)]
#[command(
name = "termcinema",
author,
version,
about = "🎬 Turn terminal into cinematic SVG",
help_template = "\
{name} {version}
{about}
📥 Input:
-i, --input <INPUT> Input raw text directly
-s, --script <FILE> Load from a script file
(stdin) echo \"The quick brown fox\" | termcinema
💾 Output:
-o, --output <FILE> Write SVG to file (default: stdout)
🎨 Style:
--theme <THEME> Theme name (e.g. \"dos_classic\", see --list-themes for all)
--font-family <FONT> Font family name (e.g. \"Monospace\", see --list-fonts for all)
--font-size <PX> Font size in pixels
--text-color <HEX> Text color (e.g. \"#00FF00\")
--background-color <HEX> Background color (e.g. \"#000000\")
--cursor-char <CHAR> Custom cursor character (e.g. \"_\")
📐 Layout:
--width <PX> SVG width in pixels
--height <PX> SVG height in pixels
--padding <PX> Margin (default 10px)
--line-spacing <PX> Line spacing in pixels
--align <left|center|right> Horizontal alignment
--v-align <top|middle|bottom> Vertical alignment
🎞️ Animation:
--speed <slow|normal|fast|extreme> Typing speed preset (e.g. \"normal\")
--frame-delay <MS> Frame delay per character (ms, lower = faster)
--fade-duration <MS> Fade-in duration per char (e.g. 100)
⚙️ Advanced:
--no-escape Disable escape sequences
--list-fonts List all built-in fonts
--list-themes List all built-in themes
❓ Help:
-h, --help Print help
-V, --version Print version
"
)]
pub struct CliArgs {
#[arg(short = 'i', long, value_name = "TEXT", conflicts_with = "script")]
pub input: Option<String>,
#[arg(short = 's', long, value_name = "FILE", conflicts_with = "input")]
pub script: Option<PathBuf>,
#[arg(short = 'o', long, value_name = "FILE")]
pub output: Option<String>,
#[arg(long, value_name = "NAME")]
pub theme: Option<String>,
#[arg(long, value_name = "FONT")]
pub font_family: Option<String>,
#[arg(long, value_name = "PX")]
pub font_size: Option<u32>,
#[arg(long, value_name = "HEX")]
pub text_color: Option<String>,
#[arg(long, value_name = "HEX")]
pub background_color: Option<String>,
#[arg(long, value_name = "CHAR")]
pub cursor_char: Option<String>,
#[arg(long, value_name = "PX")]
pub width: Option<u32>,
#[arg(long, value_name = "PX")]
pub height: Option<u32>,
#[arg(long, value_name = "PX")]
pub padding: Option<u32>,
#[arg(long, value_name = "PX")]
pub line_spacing: Option<u32>,
#[arg(long, value_name = "ENUM")]
pub align: Option<String>,
#[arg(long, value_name = "ENUM")]
pub v_align: Option<String>,
#[arg(long, value_name = "ENUM", conflicts_with = "frame_delay")]
pub speed: Option<String>,
#[arg(long, value_name = "MS", conflicts_with = "speed")]
pub frame_delay: Option<u32>,
#[arg(long, value_name = "MS")]
pub fade_duration: Option<u32>,
#[arg(long, default_value_t = false)]
pub no_escape: bool,
#[arg(long, default_value_t = false)]
pub list_fonts: bool,
#[arg(long, default_value_t = false)]
pub list_themes: bool,
}
#[allow(dead_code)]
pub(crate) fn parse_args() -> CliArgs {
CliArgs::parse()
}
#[allow(dead_code)]
pub fn default_args() -> CliArgs {
CliArgs::default()
}
impl Default for CliArgs {
fn default() -> Self {
Self {
input: None,
script: None,
output: None,
theme: None,
font_family: None,
font_size: Some(16),
text_color: None,
background_color: None,
cursor_char: None,
width: Some(800),
height: Some(600),
padding: Some(10),
line_spacing: Some(6),
align: Some("left".into()),
v_align: Some("middle".into()),
speed: Some("normal".into()),
frame_delay: None,
fade_duration: Some(100),
no_escape: false,
list_fonts: false,
list_themes: false,
}
}
}