use crate::config::Config;
use anyhow::{anyhow, Context, Result};
use log::{debug, warn};
use std::env;
use crate::literals::FXP_VIDEOCLIPPER_FPS;
enum FpsSource {
CliArgument(u32),
EnvironmentVariable,
FromConfigFile(u32),
}
pub fn get_fps(cli_fps: Option<u32>, config: &Config) -> Result<u32> {
debug!("Starting to resolve FPS...");
let fps_source = if let Some(fps_value) = cli_fps {
debug!("Using FPS provided via CLI argument: {}", fps_value);
FpsSource::CliArgument(fps_value)
} else if env::var(FXP_VIDEOCLIPPER_FPS).is_ok() {
debug!("Using FPS from FXP_VIDEOCLIPPER_FPS environment variable.");
FpsSource::EnvironmentVariable
} else if config.fps > 0 {
debug!("Using FPS from configuration file: {}", config.fps);
FpsSource::FromConfigFile(config.fps)
} else {
warn!("No FPS source provided and no fallback methods available");
return Err(anyhow!(
"No FPS source provided and no fallback methods available"
));
};
debug!("Resolving FPS value based on the determined source...");
resolve_fps(fps_source)
}
fn resolve_fps(fps_source: FpsSource) -> Result<u32> {
debug!("Resolving FPS value based on the provided source...");
match fps_source {
FpsSource::CliArgument(fps) => {
debug!("Using FPS provided via CLI argument: {}", fps);
Ok(fps)
}
FpsSource::EnvironmentVariable => {
debug!("Searching for FPS in FXP_VIDEOCLIPPER_FPS environment variable...");
let fps_str = env::var(FXP_VIDEOCLIPPER_FPS)
.context("Failed to read FXP_VIDEOCLIPPER_FPS environment variable")?;
let fps = fps_str.parse::<u32>().context(format!(
"Invalid FPS value in FXP_VIDEOCLIPPER_FPS: '{}",
fps_str
))?;
Ok(fps)
}
FpsSource::FromConfigFile(fps) => {
debug!("Using FPS from configuration file: {}", fps);
Ok(fps)
}
}
}