From cb6bce2ba53a1a89fc1dc149bf5985818ec1a7ea Mon Sep 17 00:00:00 2001 From: Kinch Date: Tue, 19 Sep 2023 19:57:12 +0200 Subject: [PATCH] working on zip writer --- lua/fs.example.lua | 15 ++++++++------- lua_modules/filesystem/src/sinks/mod.rs | 14 +++++++++++++- lua_modules/filesystem/src/sinks/zip_sink.rs | 15 +++++++++++++-- .../filesystem/src/source/directory_source.rs | 7 +++++++ lua_modules/filesystem/src/source/mod.rs | 5 +++++ 5 files changed, 46 insertions(+), 10 deletions(-) diff --git a/lua/fs.example.lua b/lua/fs.example.lua index 80dd3ce..e155f2f 100644 --- a/lua/fs.example.lua +++ b/lua/fs.example.lua @@ -64,15 +64,16 @@ function does_not(predicate) return function(...) return not predicate(...) end end +function zip(source) + print("would zip") + for entry in source do + print(entry.path) + end +end + local comic_dir = directory("/Users/kinch/Desktop/Rebuild World") comic_dir:filter(is_dir) for chapter_dir in comic_dir do - print(chapter_dir) - --local images = FileTree - -- :new(fs.directory(chapter_dir.path)) - -- :filter(does_not(contains("._"))) - --for img in images do - -- print(img) - --end + zip(directory(chapter_dir):filter(does_not(contains("._")))) end \ No newline at end of file diff --git a/lua_modules/filesystem/src/sinks/mod.rs b/lua_modules/filesystem/src/sinks/mod.rs index 4affbff..0fcaa5b 100644 --- a/lua_modules/filesystem/src/sinks/mod.rs +++ b/lua_modules/filesystem/src/sinks/mod.rs @@ -1,8 +1,20 @@ use crate::resources::input_stream::DynResourceInputStream; +use crate::resources::Resource; +use mlua::{UserData, UserDataMethods}; +use std::path::PathBuf; mod zip_sink; pub trait ResourceSink { + fn new(path: PathBuf) -> Self; fn add_file(&mut self, input: DynResourceInputStream); - fn add_directory(&mut self); + fn add_directory(&mut self, dirname: String); +} + +pub struct ResourceSinkWrapper(SinkType); + +impl UserData for ResourceSinkWrapper { + fn add_methods<'lua, M: UserDataMethods<'lua, Self>>(methods: &mut M) { + methods.add_method_mut("add_file", |lua, this, resouce: DynResourceInputStream|) + } } diff --git a/lua_modules/filesystem/src/sinks/zip_sink.rs b/lua_modules/filesystem/src/sinks/zip_sink.rs index 46d23e6..80dc6f9 100644 --- a/lua_modules/filesystem/src/sinks/zip_sink.rs +++ b/lua_modules/filesystem/src/sinks/zip_sink.rs @@ -2,6 +2,7 @@ use crate::resources::input_stream::DynResourceInputStream; use crate::sinks::ResourceSink; use std::fs::File; use std::io::Write; +use std::path::PathBuf; use std::ptr::write; use zip::ZipWriter; @@ -10,10 +11,20 @@ pub struct ZipSink { } impl ResourceSink for ZipSink { - fn add(&mut self, mut input: DynResourceInputStream) { + fn new(path: PathBuf) -> Self { + ZipSink { + writer: ZipWriter::new(std::fs::File::create(path).expect("could not create file")), + } + } + + fn add_file(&mut self, mut input: DynResourceInputStream) { self.writer - .start_file(input.path(), Default::default()) + .start_file(input.path().display().to_string(), Default::default()) .expect("error writing zip"); std::io::copy(&mut input, &mut self.writer).expect("error writing zip"); } + + fn add_directory(&mut self, dirname: String) { + todo!("implementing adding directory") + } } diff --git a/lua_modules/filesystem/src/source/directory_source.rs b/lua_modules/filesystem/src/source/directory_source.rs index b744474..2d74ce0 100644 --- a/lua_modules/filesystem/src/source/directory_source.rs +++ b/lua_modules/filesystem/src/source/directory_source.rs @@ -1,5 +1,6 @@ use crate::resources::resource_filesystem::FilesystemResource; use crate::resources::ResourceWrapper; +use crate::source::RessourceSource; use mlua::{MetaMethod, UserData, UserDataMethods}; use std::fs::{read_dir, ReadDir}; use std::path::PathBuf; @@ -17,6 +18,12 @@ impl From for DirectorySource { } } +impl RessourceSource for DirectorySource { + fn root(&self) -> FilesystemResource { + self.path.clone().into() + } +} + impl Iterator for DirectorySource { type Item = FilesystemResource; diff --git a/lua_modules/filesystem/src/source/mod.rs b/lua_modules/filesystem/src/source/mod.rs index 50cbd19..7bb405b 100644 --- a/lua_modules/filesystem/src/source/mod.rs +++ b/lua_modules/filesystem/src/source/mod.rs @@ -1 +1,6 @@ +use crate::resources::Resource; + pub mod directory_source; +pub trait RessourceSource: Iterator { + fn root(&self) -> ResType; +}