use async_trait::async_trait;
use oci_distribution::client::ImageData;
use oci_distribution::manifest;
use oci_distribution::secrets::RegistryAuth;
use oci_distribution::Reference;
#[async_trait]
pub trait Client {
async fn pull(
&mut self,
image_ref: &Reference,
auth: &RegistryAuth,
) -> anyhow::Result<ImageData>;
async fn fetch_digest(
&mut self,
image_ref: &Reference,
auth: &RegistryAuth,
) -> anyhow::Result<String> {
let image_data = self.pull(image_ref, auth).await?;
image_data
.digest
.ok_or_else(|| anyhow::anyhow!("image {} does not have a digest", image_ref))
}
}
#[async_trait]
impl Client for oci_distribution::Client {
async fn pull(&mut self, image: &Reference, auth: &RegistryAuth) -> anyhow::Result<ImageData> {
self.pull(image, auth, vec![manifest::WASM_LAYER_MEDIA_TYPE])
.await
}
async fn fetch_digest(
&mut self,
image: &Reference,
auth: &RegistryAuth,
) -> anyhow::Result<String> {
self.fetch_manifest_digest(image, auth).await
}
}