use std::sync::Arc;
use anyhow::Result;
use arcbox_image::{pull::ConsoleProgress, ImageRef, ImageStore, RegistryClient};
use clap::Args;
#[derive(Args)]
pub struct PullArgs {
pub image: String,
#[arg(short, long)]
pub all_tags: bool,
#[arg(short, long)]
pub quiet: bool,
}
pub async fn execute(args: PullArgs) -> Result<()> {
let reference = ImageRef::parse(&args.image)
.ok_or_else(|| anyhow::anyhow!("invalid image reference: {}", args.image))?;
if !args.quiet {
println!("Pulling {}...", reference);
}
let store = Arc::new(ImageStore::open_default()?);
let client = RegistryClient::new(&reference.registry);
let puller = arcbox_image::pull::ImagePuller::new(store, client);
let image_id = if args.quiet {
puller.pull(&reference).await?
} else {
puller
.with_progress(ConsoleProgress)
.pull(&reference)
.await?
};
let short_id = short_digest(&image_id);
if !args.quiet {
println!("Successfully pulled {}", reference);
println!("Image ID: {short_id}");
} else {
println!("{short_id}");
}
Ok(())
}
fn short_digest(digest: &str) -> &str {
let s = digest.strip_prefix("sha256:").unwrap_or(digest);
&s[..12.min(s.len())]
}