quilt-rs 0.27.3

Rust library for accessing Quilt data packages.
Documentation
use std::path::PathBuf;

use crate::checksum::MULTIHASH_SHA256_CHUNKED;
use aws_smithy_types::base64;
use multihash::Multihash;

use crate::Error;
use crate::Res;

pub mod top_hash;

fn local_uri(key: &str) -> Res<PathBuf> {
    Ok(std::env::current_dir()?.join(key))
}

pub mod manifest {
    use super::local_uri;

    use std::path::PathBuf;

    use crate::Res;

    const MANIFEST_LOCATION: &str = "fixtures/packages/checksummed.jsonl";

    pub const TOP_HASH: &str = "87c4c6caa2eaeb346ea8c3a5c3650a54b9ae93ed5229db67eac7449fc198f0c5";

    pub fn path() -> Res<PathBuf> {
        local_uri(MANIFEST_LOCATION)
    }
}

pub fn create_multihash(b64_str: &str) -> Res<Multihash<256>> {
    Ok(Multihash::wrap(
        MULTIHASH_SHA256_CHUNKED,
        &base64::decode(b64_str).map_err(|e| Error::Checksum(e.to_string()))?,
    )?)
}

pub mod manifest_with_objects_all_sizes {
    use std::path::PathBuf;

    use super::create_multihash;
    use super::local_uri;
    use super::objects;

    use crate::manifest::Manifest;
    use crate::manifest::ManifestRow;
    use crate::Res;

    const JSONL: &str = "fixtures/ref-manifest-sizes.jsonl";

    pub const TOP_HASH: &str = "a8287f20eb1e315a08ce08d9488dc1e8c75ba45d4549bb4351a74c92b217c3c0";

    pub fn jsonl_path() -> Res<PathBuf> {
        local_uri(JSONL)
    }

    pub async fn manifest() -> Res<Manifest> {
        let mut manifest = Manifest::default();
        manifest
            .insert_record(ManifestRow {
                logical_key: PathBuf::from("0mb.bin"),
                size: 0,
                hash: create_multihash(objects::ZERO_HASH_B64)?.try_into()?,
                ..ManifestRow::default()
            })
            .await?;
        manifest
            .insert_record(ManifestRow {
                logical_key: PathBuf::from("bigger-than-8mb.txt"),
                size: 18874368,
                hash: create_multihash(objects::MORE_THAN_8MB_HASH_B64)?.try_into()?,
                ..ManifestRow::default()
            })
            .await?;
        manifest
            .insert_record(ManifestRow {
                logical_key: PathBuf::from("equal-to-8mb.txt"),
                size: 8388608,
                hash: create_multihash(objects::EQUAL_TO_8MB_HASH_B64)?.try_into()?,
                ..ManifestRow::default()
            })
            .await?;
        manifest
            .insert_record(ManifestRow {
                logical_key: PathBuf::from("less-then-8mb.txt"),
                size: 16,
                hash: create_multihash(objects::LESS_THAN_8MB_HASH_B64)?.try_into()?,
                ..ManifestRow::default()
            })
            .await?;
        manifest
            .insert_record(ManifestRow {
                logical_key: PathBuf::from("one/two two/three three three/READ ME.md"),
                size: 20,
                hash: create_multihash(objects::NESTED_HASH_B64)?.try_into()?,
                ..ManifestRow::default()
            })
            .await?;
        Ok(manifest)
    }
}

pub mod objects {
    pub const ZERO_HASH_B64: &str = "47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=";

    pub const ZERO_HASH_HEX: &str =
        "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855";

    pub fn zero_bytes<'a>() -> &'a [u8] {
        &[]
    }

    pub const LESS_THAN_8MB_HASH_B64: &str = "Xb1PbjJeWof4zD7zuHc9PI7sLiz/Ykj4gphlaZEt3xA=";

    pub const LESS_THAN_8MB_HASH_HEX: &str =
        "5dbd4f6e325e5a87f8cc3ef3b8773d3c8eec2e2cff6248f882986569912ddf10";

    pub fn less_than_8mb<'a>() -> &'a [u8] {
        "0123456789abcdef".as_bytes()
    }

    pub const EQUAL_TO_8MB_HASH_B64: &str = "7V3rZ3Q/AmAYax2wsQBZbc7N1EMIxlxRyMiMthGRdwg=";

    pub const EQUAL_TO_8MB_HASH_HEX: &str =
        "ed5deb67743f0260186b1db0b100596dcecdd44308c65c51c8c88cb611917708";

    pub fn equal_to_8mb() -> Vec<u8> {
        "12345678".as_bytes().repeat(1024 * 1024)
    }

    pub const MORE_THAN_8MB_HASH_B64: &str = "T+rt/HKRJOiAkEGXKvc+DhCwRcrZiDrFkjKonDT1zgs=";

    pub const MORE_THAN_8MB_HASH_HEX: &str =
        "4feaedfc729124e8809041972af73e0e10b045cad9883ac59232a89c34f5ce0b";

    pub fn more_than_8mb() -> Vec<u8> {
        "1234567890abcdefgh".as_bytes().repeat(1024 * 1024)
    }

    pub const NESTED_HASH_B64: &str = "J6TS3FqxN+VOhVoaoPU5OsYMUsq6652ykBrlW7krP/k=";

    pub fn nested<'a>() -> &'a [u8] {
        "This is the README.".as_bytes()
    }
}