use std::sync::Arc;
use clap::Args;
use holodeck_core::models::SimulatorState;
use holodeck_core::{LiveSimctlClient, SimctlClient};
use holodeck_services::SimulatorService;
use crate::resolve::resolve_in_state;
#[derive(Args, Debug)]
pub struct LaunchArgs {
pub query: String,
pub bundle_id: String,
#[arg(long)]
pub language: Option<String>,
}
impl LaunchArgs {
pub async fn run(&self) -> anyhow::Result<()> {
let client: Arc<dyn SimctlClient> = Arc::new(LiveSimctlClient::new());
let service = SimulatorService::new(client.clone());
let sim =
resolve_in_state(&service, &self.query, SimulatorState::Booted, "apps can only be launched on booted simulators")
.await?;
let language = self.language.as_deref().filter(|tag| !tag.is_empty());
client.launch_app(sim.id, &self.bundle_id, language).await?;
match language {
Some(tag) => println!("Launched {} on {} in {}.", self.bundle_id, sim.name, tag),
None => println!("Launched {} on {}.", self.bundle_id, sim.name),
}
Ok(())
}
}