#![allow(missing_docs)]
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize, zlink::introspect::Type)]
pub struct StorageLocator {
pub storage_path: String,
pub layer_id: String,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize, zlink::introspect::Type)]
pub struct GetLayerParams {
pub diff_id: Option<String>,
pub storage: Option<StorageLocator>,
#[serde(default)]
pub consumer_has_cap_dac_override: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize, zlink::introspect::Type)]
pub struct GetInfoReply {
pub features: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, zlink::introspect::Type)]
pub struct HasLayerReply {
pub present: bool,
pub layer_verity: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, zlink::introspect::Type)]
pub struct GetLayerReply {
pub dir_count: u32,
}
#[derive(Debug, Clone, Serialize, Deserialize, zlink::introspect::Type)]
pub struct PutLayerReply {
pub layer_verity: String,
pub already_present: bool,
#[serde(default)]
pub objects_reflinked: u64,
#[serde(default)]
pub objects_hardlinked: u64,
#[serde(default)]
pub objects_copied: u64,
#[serde(default)]
pub objects_already_present: u64,
}
#[derive(Debug, Clone, Serialize, Deserialize, zlink::introspect::Type)]
pub struct LayerRef {
pub diff_id: String,
pub layer_verity: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, zlink::introspect::Type)]
pub struct FinalizeImageReply {
pub manifest_digest: String,
pub manifest_verity: String,
pub config_digest: String,
pub config_verity: String,
}
#[derive(Debug, zlink::ReplyError, zlink::introspect::ReplyError)]
#[zlink(interface = "org.composefs.Oci")]
pub enum OciError {
RepoNotFound {
message: String,
},
InvalidHandle {
handle: u64,
},
NoSuchImage {
image: String,
},
InternalError {
message: String,
},
NoSuchLayer {
diff_id: String,
},
InvalidDigest {
message: String,
},
DiffIdMismatch {
expected: String,
actual: String,
},
InvalidRequest {
message: String,
},
FdLimitExceeded {
fd_count: u64,
max_per_frame: u64,
},
}
#[zlink::proxy(interface = "org.composefs.Oci")]
pub trait OciProxy {
async fn get_info(&mut self) -> zlink::Result<Result<GetInfoReply, OciError>>;
async fn has_layer(
&mut self,
handle: u64,
diff_id: &str,
) -> zlink::Result<Result<HasLayerReply, OciError>>;
#[zlink(more, return_fds)]
async fn get_layer(
&mut self,
handle: u64,
params: GetLayerParams,
) -> zlink::Result<
impl zlink::futures_util::Stream<
Item = zlink::Result<(Result<GetLayerReply, OciError>, Vec<std::os::fd::OwnedFd>)>,
>,
>;
async fn put_layer(
&mut self,
handle: u64,
diff_id: &str,
zerocopy: bool,
#[zlink(fds)] fds: Vec<std::os::fd::OwnedFd>,
) -> zlink::Result<Result<PutLayerReply, OciError>>;
async fn finalize_image(
&mut self,
handle: u64,
manifest_json: &str,
config_json: &str,
layers: Vec<LayerRef>,
name: Option<&str>,
) -> zlink::Result<Result<FinalizeImageReply, OciError>>;
}