aether_renderer_core/
config.rs

1use serde::Deserialize;
2use std::path::PathBuf;
3
4/// Render configuration loaded from a JSON file or CLI arguments
5#[derive(Debug, Deserialize)]
6pub struct RenderConfig {
7    pub input: PathBuf,
8    pub output: String,
9    #[serde(default = "default_fps")]
10    pub fps: u32,
11    #[serde(default = "default_format")]
12    pub format: String,
13    #[serde(default)]
14    pub fade_in: f32,
15    #[serde(default)]
16    pub fade_out: f32,
17    #[serde(default)]
18    pub bitrate: Option<String>,
19    #[serde(default)]
20    pub crf: Option<u32>,
21    #[serde(default)]
22    pub open: bool,
23    #[serde(default)]
24    pub preview: Option<usize>, // None = no preview, Some(n) = preview n frames
25    #[serde(default)]
26    pub file_pattern: Option<String>,
27    #[serde(default)]
28    pub verbose: bool,
29    #[serde(default)]
30    pub verbose_ffmpeg: bool,
31}
32
33fn default_fps() -> u32 {
34    30
35}
36
37fn default_format() -> String {
38    "webm".into()
39}
40
41impl RenderConfig {
42    /// Load configuration from a JSON file
43    pub fn from_file(path: &str) -> Result<Self, String> {
44        let config_str = std::fs::read_to_string(path)
45            .map_err(|_| format!("❌ Config file '{}' not found.", path))?;
46        serde_json::from_str(&config_str).map_err(|e| format!("❌ Failed to parse config: {}", e))
47    }
48
49    pub fn is_preview(&self) -> bool {
50        self.preview.is_some()
51    }
52
53    pub fn preview_frame_limit(&self) -> Option<usize> {
54        self.preview
55    }
56}