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}