use rlua::prelude::*;use zip::ZipArchive;use std::fs;use std::io;use std::path::Path;pub fn init(lua: &Lua) -> crate::Result<()> { let module = lua.create_table()?; module.set("decompress", lua.create_function(|_, (src, dst): (String, String)| { let zip = fs::File::open(src).map_err(LuaError::external)?; ZipArchive::new(zip).map_err(LuaError::external).and_then(|mut archive|{ let path = Path::new(&dst); for i in 0..archive.len() { let mut temp = archive.by_index(i).map_err(LuaError::external)?; let outpath = temp.sanitized_name(); if (&*temp.name()).ends_with('/') { fs::create_dir_all(path.join(&outpath)).map_err(LuaError::external)?; } else { if let Some(p) = outpath.parent() { if !p.exists() { fs::create_dir_all(path.join(p)).map_err(LuaError::external)?; } } let p = path.join(&outpath); fs::File::create(p) .and_then(|mut output| io::copy(&mut temp, &mut output) ).map_err(LuaError::external)?; } } Ok(()) }) })?)?; lua.globals().set("zip", module)?; Ok(())}