Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Assets container wrapper

ContainerAssetFetch allows for partial loading from sources that are considered containers that store other assets. Typical container example would be ZIP archives, databases, etc.

use keket::{
    database::{AssetDatabase, path::AssetPath},
    fetch::container::{ContainerAssetFetch, ContainerPartialFetch},
    protocol::text::TextAssetProtocol,
};
use std::{error::Error, fs::File, io::Read};
use zip::ZipArchive;

fn main() -> Result<(), Box<dyn Error>> {
    let mut database = AssetDatabase::default()
        .with_protocol(TextAssetProtocol)
        // Container asset fetch allows to use partial asset fetch object
        // that can take asset path and returns bytes from some container.
        .with_fetch(ContainerAssetFetch::new(ZipContainerPartialFetch::new(
            ZipArchive::new(File::open("./resources/package.zip")?)?,
        )));

    let lorem = database.ensure("text://lorem.txt")?;
    println!("Lorem Ipsum: {}", lorem.access::<&String>(&database));

    Ok(())
}

// Here we show how to make ZIP archive file reader.
struct ZipContainerPartialFetch {
    archive: ZipArchive<File>,
}

impl ZipContainerPartialFetch {
    pub fn new(archive: ZipArchive<File>) -> Self {
        Self { archive }
    }
}

impl ContainerPartialFetch for ZipContainerPartialFetch {
    // We use input path and try to unpack file under that path from ZIP archive.
    fn load_bytes(&mut self, path: AssetPath) -> Result<Vec<u8>, Box<dyn Error>> {
        let mut file = self
            .archive
            .by_name(path.path())
            .map_err(|error| format!("Could not read zip file: `{}` - {}", path.path(), error))?;
        let mut bytes = vec![];
        file.read_to_end(&mut bytes)?;
        Ok(bytes)
    }
}
use keket::{
    database::{AssetDatabase, path::AssetPath},
    fetch::container::{ContainerAssetFetch, ContainerPartialFetch},
    protocol::text::TextAssetProtocol,
};
use std::{error::Error, fs::File, io::Read};
use zip::ZipArchive;

fn main() -> Result<(), Box<dyn Error>> {
    let mut database = AssetDatabase::default()
        .with_protocol(TextAssetProtocol)
        // Container asset fetch allows to use partial asset fetch object
        // that can take asset path and returns bytes from some container.
        .with_fetch(ContainerAssetFetch::new(ZipContainerPartialFetch::new(
            ZipArchive::new(File::open("./resources/package.zip")?)?,
        )));

    let lorem = database.ensure("text://lorem.txt")?;
    println!("Lorem Ipsum: {}", lorem.access::<&String>(&database));

    Ok(())
}

// Here we show how to make ZIP archive file reader.
struct ZipContainerPartialFetch {
    archive: ZipArchive<File>,
}

impl ZipContainerPartialFetch {
    pub fn new(archive: ZipArchive<File>) -> Self {
        Self { archive }
    }
}

impl ContainerPartialFetch for ZipContainerPartialFetch {
    // We use input path and try to unpack file under that path from ZIP archive.
    fn load_bytes(&mut self, path: AssetPath) -> Result<Vec<u8>, Box<dyn Error>> {
        let mut file = self
            .archive
            .by_name(path.path())
            .map_err(|error| format!("Could not read zip file: `{}` - {}", path.path(), error))?;
        let mut bytes = vec![];
        file.read_to_end(&mut bytes)?;
        Ok(bytes)
    }
}