use clap::Args;
use microsandbox::sandbox::Sandbox;
use super::common::{SandboxOpts, apply_sandbox_opts};
use crate::ui;
#[derive(Debug, Args)]
pub struct CreateArgs {
pub image: String,
#[command(flatten)]
pub sandbox: SandboxOpts,
}
pub async fn run(args: CreateArgs) -> anyhow::Result<()> {
let is_named = args.sandbox.name.is_some();
let name = args.sandbox.name.clone().unwrap_or_else(ui::generate_name);
let builder = Sandbox::builder(&name).image(args.image.as_str());
let builder = apply_sandbox_opts(builder, &args.sandbox)?;
let (mut progress, task) = builder.create_detached_with_pull_progress()?;
let mut display = if args.sandbox.quiet {
ui::PullProgressDisplay::quiet(&args.image)
} else {
ui::PullProgressDisplay::new(&args.image)
};
while let Some(event) = progress.recv().await {
display.handle_event(event);
}
match task.await {
Ok(Ok(sandbox)) => {
display.finish();
sandbox.detach().await;
if !is_named {
println!("{name}");
}
}
Ok(Err(e)) => {
display.finish();
return Err(e.into());
}
Err(e) => {
display.finish();
return Err(anyhow::anyhow!("create task panicked: {e}"));
}
}
Ok(())
}