aether_renderer_core/
config.rs1use serde::Deserialize;
2use std::path::PathBuf;
3
4#[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>, #[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 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}