termcinema_engine/core/control.rs
1use crate::constants::*;
2
3/// Controls playback behavior of the SVG animation.
4///
5/// This struct defines timing-related parameters that
6/// influence how characters are rendered over time:
7///
8/// - [`frame_delay`] → typing interval per character (ms);
9/// - [`fade_duration`] → fade-in duration per character (ms);
10/// - [`start_delay`] → delay before animation begins (ms).
11///
12/// These values can be customized via CLI arguments or presets.
13#[derive(Clone)]
14pub struct ControlSpec {
15 /// Optional delay per character in milliseconds (typing speed).
16 /// If `None`, falls back to [`DEFAULT_CONTROL_FRAME_DELAY`].
17 pub frame_delay: Option<u32>,
18
19 /// Optional duration of character fade-in animation (in ms).
20 /// If `None`, falls back to [`DEFAULT_CONTROL_FADE_DURATION`].
21 pub fade_duration: Option<u32>,
22
23 /// Optional initial delay before animation starts (in ms).
24 /// If `None`, falls back to [`DEFAULT_CONTROL_START_DELAY`].
25 pub start_delay: Option<u32>,
26}
27
28/// Default timing values for [`ControlSpec`].
29///
30/// These defaults are context-agnostic and used when
31/// no override is provided (e.g. from CLI or theme).
32impl Default for ControlSpec {
33 fn default() -> Self {
34 ControlSpec {
35 frame_delay: Some(DEFAULT_CONTROL_FRAME_DELAY),
36 fade_duration: Some(DEFAULT_CONTROL_FADE_DURATION),
37 start_delay: Some(DEFAULT_CONTROL_START_DELAY),
38 }
39 }
40}
41
42/// Unwraps optional control values into concrete timings.
43///
44/// This utility function extracts the final values used
45/// in rendering, applying fallback defaults if any field is `None`.
46///
47/// Returns a tuple: `(frame_delay, fade_duration, start_delay)`
48/// — all in milliseconds.
49#[rustfmt::skip]
50pub(crate) fn extract_control_primitives(control: &ControlSpec) -> (u32, u32, u32) {
51 (
52 control.frame_delay.unwrap_or(DEFAULT_CONTROL_FRAME_DELAY),
53 control.fade_duration.unwrap_or(DEFAULT_CONTROL_FADE_DURATION),
54 control.start_delay.unwrap_or(DEFAULT_CONTROL_START_DELAY),
55 )
56}