use async_trait::async_trait;
use std::sync::Arc;
use crate::BoxliteResult;
use crate::images::ImageObject;
use crate::runtime::types::ImageInfo;
#[allow(
clippy::double_must_use,
reason = "async_trait generates a must-use boxed future"
)]
#[async_trait]
pub(crate) trait ImageBackend: Send + Sync {
async fn pull_image(&self, image_ref: &str) -> BoxliteResult<ImageObject>;
async fn list_images(&self) -> BoxliteResult<Vec<ImageInfo>>;
}
#[derive(Clone)]
pub struct ImageHandle {
manager: Arc<dyn ImageBackend>,
}
impl ImageHandle {
pub(crate) fn new(manager: Arc<dyn ImageBackend>) -> Self {
Self { manager }
}
pub async fn pull(&self, image_ref: &str) -> BoxliteResult<ImageObject> {
self.manager.pull_image(image_ref).await
}
pub async fn list(&self) -> BoxliteResult<Vec<ImageInfo>> {
self.manager.list_images().await
}
}