From e96052c28607c6c9d996caf24c71b2ca6652ba7a Mon Sep 17 00:00:00 2001 From: Kinch Date: Sun, 17 Sep 2023 21:49:37 +0200 Subject: [PATCH] add with input stream --- .../filesystem/src/resources/input_stream.rs | 8 ++++++++ .../src/resources/input_stream_filesystem.rs | 0 lua_modules/filesystem/src/resources/mod.rs | 2 ++ lua_modules/filesystem/src/sinks/mod.rs | 7 ++++++- lua_modules/filesystem/src/sinks/zip_sink.rs | 19 +++++++++++++++++++ 5 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 lua_modules/filesystem/src/resources/input_stream.rs create mode 100644 lua_modules/filesystem/src/resources/input_stream_filesystem.rs diff --git a/lua_modules/filesystem/src/resources/input_stream.rs b/lua_modules/filesystem/src/resources/input_stream.rs new file mode 100644 index 0000000..53556c6 --- /dev/null +++ b/lua_modules/filesystem/src/resources/input_stream.rs @@ -0,0 +1,8 @@ +use std::ops::Deref; +use std::path::PathBuf; + +pub trait ResourceInputStream: std::io::Read { + fn path(&self) -> PathBuf; +} + +pub type DynResourceInputStream = Box; diff --git a/lua_modules/filesystem/src/resources/input_stream_filesystem.rs b/lua_modules/filesystem/src/resources/input_stream_filesystem.rs new file mode 100644 index 0000000..e69de29 diff --git a/lua_modules/filesystem/src/resources/mod.rs b/lua_modules/filesystem/src/resources/mod.rs index 2c9c359..e69b32a 100644 --- a/lua_modules/filesystem/src/resources/mod.rs +++ b/lua_modules/filesystem/src/resources/mod.rs @@ -1,3 +1,5 @@ +pub mod input_stream; +mod input_stream_filesystem; pub mod resource_filesystem; use mlua::{MetaMethod, UserData, UserDataFields, UserDataMethods}; diff --git a/lua_modules/filesystem/src/sinks/mod.rs b/lua_modules/filesystem/src/sinks/mod.rs index c6c0d34..4affbff 100644 --- a/lua_modules/filesystem/src/sinks/mod.rs +++ b/lua_modules/filesystem/src/sinks/mod.rs @@ -1,3 +1,8 @@ +use crate::resources::input_stream::DynResourceInputStream; + mod zip_sink; -pub trait ResourceSink {} +pub trait ResourceSink { + fn add_file(&mut self, input: DynResourceInputStream); + fn add_directory(&mut self); +} diff --git a/lua_modules/filesystem/src/sinks/zip_sink.rs b/lua_modules/filesystem/src/sinks/zip_sink.rs index e69de29..46d23e6 100644 --- a/lua_modules/filesystem/src/sinks/zip_sink.rs +++ b/lua_modules/filesystem/src/sinks/zip_sink.rs @@ -0,0 +1,19 @@ +use crate::resources::input_stream::DynResourceInputStream; +use crate::sinks::ResourceSink; +use std::fs::File; +use std::io::Write; +use std::ptr::write; +use zip::ZipWriter; + +pub struct ZipSink { + writer: ZipWriter, +} + +impl ResourceSink for ZipSink { + fn add(&mut self, mut input: DynResourceInputStream) { + self.writer + .start_file(input.path(), Default::default()) + .expect("error writing zip"); + std::io::copy(&mut input, &mut self.writer).expect("error writing zip"); + } +}