use std::path::PathBuf;
use clap::Args;
use holodeck_core::default_media_path;
use holodeck_core::models::{SimulatorState, VideoCodec};
use holodeck_services::AppDependencies;
use crate::resolve::resolve_in_state;
use crate::value_parsers::parse_video_codec;
#[derive(Args, Debug)]
pub struct RecordArgs {
pub query: String,
#[arg(short, long)]
pub output: Option<String>,
#[arg(long, value_parser = parse_video_codec)]
pub codec: Option<VideoCodec>,
}
impl RecordArgs {
pub async fn run(&self) -> anyhow::Result<()> {
let dependencies = AppDependencies::live();
let codec = self.codec.unwrap_or(dependencies.configuration.video_codec);
let sim = resolve_in_state(
&dependencies.simulator_service,
&self.query,
SimulatorState::Booted,
"only booted simulators can be recorded",
)
.await?;
let out_path = match &self.output {
Some(path) => PathBuf::from(shellexpand::tilde(path).into_owned()),
None => {
default_media_path::record(&dependencies.configuration.resolved_screenshots_directory(), chrono::Local::now())
}
};
dependencies.recording_service.start(sim.id, &out_path, codec).await?;
eprintln!("Recording to {} — press Ctrl-C to stop.", out_path.display());
let ctrl_c_result = tokio::signal::ctrl_c().await;
eprintln!("\nFinalizing…");
let _ = dependencies.recording_service.stop().await;
ctrl_c_result?;
println!("{}", out_path.display());
Ok(())
}
}