liboci 0.2.0

Rust based OCI Schema parsing and helpers
Documentation
use std::fs::File;

use anyhow::Result;
use serde::de::DeserializeOwned;

use liboci::{Config, ContentDiscoveryResponse, ImageRef, OCIDir};

#[allow(dead_code)]
fn load_from_dockerhub(image_ref: &ImageRef) -> Result<ContentDiscoveryResponse> {
    let mut content_discovery_url = image_ref.get_v2_url()?;
    let base_path = content_discovery_url.path().to_owned();
    content_discovery_url.set_path((base_path + "/tags/list").as_str());
    let resp = reqwest::blocking::get(content_discovery_url)?;
    let resp = resp.json()?;
    Ok(resp)
}

fn load_from_samples<T: DeserializeOwned>(name: &str) -> Result<T> {
    let f = File::open(format!("samples/{name}.json"))?;
    Ok(serde_json::from_reader(f)?)
}

#[test]
fn test_get_ubuntu_config() -> Result<()> {
    let config: Config = load_from_samples("library-ubuntu-config")?;
    assert_eq!(config.architecture, "amd64");
    assert_eq!(config.os, "linux");
    Ok(())
}

#[test]
fn load_oci_dir() -> Result<()> {
    let dir = OCIDir::open("samples/ubuntu")?;
    assert_eq!(dir.index.schema_version, 2);
    assert_eq!(dir.manifests[0].schema_version, 2);
    Ok(())
}

#[test]
fn load_oci_dir2() -> Result<()> {
    let dir = OCIDir::open("samples/bitnami-postgresql")?;
    assert_eq!(dir.index.schema_version, 2);
    assert_eq!(dir.manifests[0].schema_version, 2);
    Ok(())
}

#[test]
fn read_write_oci_dir2() -> Result<()> {
    let dir = OCIDir::open("samples/bitnami-postgresql")?;
    assert_eq!(dir.index.schema_version, 2);
    assert_eq!(dir.manifests[0].schema_version, 2);
    let serialized = serde_json::to_value(&dir.configs[0])?;
    let mut f = File::open("samples/bitnami-postgresql/blobs/sha256/23e3fb27f226bdd839905bdf48698f1dc5f1b848962e85b74e8a2dec06dc19e0")?;
    let orig_value: serde_json::Value = serde_json::from_reader(&mut f)?;
    similar_asserts::assert_eq!(orig_value, serialized);
    Ok(())
}