use crate::args::CliArgs;
use crate::style::{parse_speed, speed_to_delay_ms, warn_about_unrecognized_font};
use termcinema_engine::{
ControlSpec, CursorSpec, StyleSpec, list_builtin_system_fonts, resolve_embedded_font,
};
pub(crate) fn patch_theme(
style: &mut StyleSpec,
cursor: &mut CursorSpec,
control: &mut ControlSpec,
args: &CliArgs,
is_script: bool,
) {
patch_style(style, cursor, args);
patch_control(control, args, is_script);
}
fn patch_style(style: &mut StyleSpec, cursor: &mut CursorSpec, args: &CliArgs) {
if let Some(ch) = &args.cursor_char {
cursor.char = ch.clone();
}
if let Some(fs) = args.font_size {
style.font_size = fs;
}
if let Some(ff) = &args.font_family {
style.font_family = ff.clone();
let is_builtin = list_builtin_system_fonts()
.iter()
.any(|(name, _)| name == ff);
let is_embeddable = resolve_embedded_font(ff).is_some();
if !is_embeddable && !is_builtin {
warn_about_unrecognized_font(ff);
}
}
if let Some(tc) = &args.text_color {
style.text_color = match tc.to_lowercase().as_str() {
"none" | "null" => None,
_ => Some(tc.clone()),
};
}
if let Some(bg) = &args.background_color {
style.background_color = match bg.to_lowercase().as_str() {
"none" | "null" => None,
_ => Some(bg.clone()),
};
}
}
fn patch_control(control: &mut ControlSpec, args: &CliArgs, is_script: bool) {
if let Some(ms) = args.frame_delay {
control.frame_delay = Some(ms);
} else if let Some(speed_str) = &args.speed {
match parse_speed(speed_str) {
Some(preset) => {
let ms = speed_to_delay_ms(&preset);
control.frame_delay = Some(ms);
}
None => {
eprintln!(
"⚠️ Unknown speed preset '{}', falling back to default.",
speed_str
);
}
}
}
if let Some(dur) = args.fade_duration {
control.fade_duration = Some(dur);
} else {
control.fade_duration = Some(if is_script { 50 } else { 100 });
}
}