torchbear 0.11.2

Lua programming environment in Rust
Documentation
use rlua::prelude::*;
use std::{
    fs,
    io::Read,
    result,
    path::Path
};
use tar::Archive;
use crate::error::Error;

use super::ByteBuf;

fn extract<T: Read>(archive: &mut Archive<T>, dst: &Path) -> result::Result<(), LuaError> {
    for file in archive.entries().map_err(LuaError::external)? {
        file
            .and_then(|mut file| file.unpack_in(&dst))
            .map_err(LuaError::external)?;
    }
    Ok(())
}

pub fn init(lua: &Lua) -> crate::Result<()> {
    let module = lua.create_table()?;
    module.set("decompress", lua.create_function(|_, (src, dst): (String, String)| {
        let tar = fs::File::open(src).map_err(LuaError::external)?;
        let dst = Path::new(&dst);
        let mut archive = Archive::new(tar);
        extract(&mut archive, &dst)
    })?)?;

    module.set("decompress_buf", lua.create_function(|_, (data, dst): (ByteBuf, String)| {
        let dst = Path::new(&dst);
        let mut archive = Archive::new(&data.0[..]);
        extract(&mut archive, &dst)
    })?)?;

    lua.globals().set("tar", module).map_err(Error::from)?;

    Ok(())
}