use ferro_oci_server::{
Descriptor, ImageManifest, Reference, classify_manifest_media_type, validate_name,
};
fn main() -> Result<(), Box<dyn std::error::Error>> {
for name in [
"alpine",
"library/alpine",
"my-org/my_team__service-v2",
"INVALID", "ends-with-dash-",
"double//slash",
] {
match validate_name(name) {
Ok(()) => println!("name OK: {name:?}"),
Err(e) => println!("name BAD: {name:?} -> {e}"),
}
}
let tag: Reference = "v1.2.3".parse()?;
let dig: Reference = format!("sha256:{}", "a".repeat(64)).parse()?;
println!("tag: {tag} (is_tag={})", tag.is_tag());
println!("dig: {dig} (is_digest={})", dig.is_digest());
let kinds = [
"application/vnd.oci.image.manifest.v1+json",
"application/vnd.oci.image.index.v1+json",
"application/vnd.docker.distribution.manifest.v2+json",
"application/vnd.docker.distribution.manifest.list.v2+json",
"text/plain",
];
for kind in kinds {
match classify_manifest_media_type(kind) {
Some(c) => println!("media-type {kind} -> {c:?}"),
None => println!("media-type {kind} -> rejected (415 Unsupported Media Type)"),
}
}
let blob_digest: ferro_blob_store::Digest = format!("sha256:{}", "b".repeat(64)).parse()?;
let cfg_digest: ferro_blob_store::Digest = format!("sha256:{}", "c".repeat(64)).parse()?;
let manifest = ImageManifest {
schema_version: 2,
media_type: Some("application/vnd.oci.image.manifest.v1+json".into()),
config: Descriptor {
media_type: "application/vnd.oci.image.config.v1+json".into(),
digest: cfg_digest,
size: 512,
urls: vec![],
annotations: None,
artifact_type: None,
platform: None,
extra: std::collections::BTreeMap::new(),
},
layers: vec![Descriptor {
media_type: "application/vnd.oci.image.layer.v1.tar+gzip".into(),
digest: blob_digest,
size: 1024,
urls: vec![],
annotations: None,
artifact_type: None,
platform: None,
extra: std::collections::BTreeMap::new(),
}],
subject: None,
artifact_type: None,
annotations: None,
extra: std::collections::BTreeMap::new(),
};
let json = serde_json::to_string_pretty(&manifest)?;
println!("manifest JSON ({} bytes):\n{json}", json.len());
let parsed: ImageManifest = serde_json::from_str(&json)?;
assert_eq!(parsed, manifest);
println!("manifest round-trip OK");
Ok(())
}