use crate::actions::StartInstanceAction;
use crate::commands::Verbosity;
use crate::error::Error;
use crate::instance::{InstanceDao, InstanceStore};
use crate::view::SpinnerView;
use clap::Parser;
use std::thread::sleep;
use std::time::Duration;
#[derive(Parser)]
pub struct InstanceStartCommand {
#[clap(long)]
pub qemu_args: Option<String>,
#[clap(short, long, default_value_t = false)]
pub wait: bool,
pub instances: Vec<String>,
}
impl InstanceStartCommand {
pub fn run(&self, instance_dao: &InstanceDao, verbosity: Verbosity) -> Result<(), Error> {
let mut actions = Vec::new();
for name in &self.instances {
let instance = &instance_dao.load(name)?;
if !instance_dao.is_running(instance) {
let mut action = StartInstanceAction::new(instance);
action.run(
instance_dao,
&instance_dao.env,
&self.qemu_args,
verbosity.is_verbose(),
)?;
actions.push(action);
}
}
if self.wait && !verbosity.is_quiet() {
let mut spinner = SpinnerView::new("Starting instance(s)");
while actions.iter().any(|a| !a.is_done()) {
sleep(Duration::from_secs(1));
}
spinner.stop()
}
Result::Ok(())
}
}