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(())}