From 7fc57fce47f9b00f40f1557c2aac1fc8c19486ba Mon Sep 17 00:00:00 2001 From: Kinch Date: Sun, 17 Sep 2023 18:39:48 +0200 Subject: [PATCH] can filter dirs --- Cargo.lock | 4 +- justfile | 4 ++ lua/fs.example.lua | 6 +- lua_modules/filesystem/src/lib.rs | 9 ++- lua_modules/filesystem/src/types/file_tree.rs | 63 +++++++++++++++++-- 5 files changed, 75 insertions(+), 11 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 1b0442d..ed1d76a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -155,9 +155,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.35" +version = "2.0.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59bf04c28bee9043ed9ea1e41afc0552288d3aba9c6efdd78903b802926f4879" +checksum = "91e02e55d62894af2a08aca894c6577281f76769ba47c94d5756bec8ac6e7373" dependencies = [ "proc-macro2", "quote", diff --git a/justfile b/justfile index acfd1bd..1863138 100755 --- a/justfile +++ b/justfile @@ -3,10 +3,14 @@ set dotenv-load := true run-fs: (lua "fs.example.lua") build-filesystem: (_copy-so "dev" "filesystem") +deploy-fs: (_deploy "filesystem") lua file: LUA_CPATH=c_modules/?.so lua lua/{{file}} +_deploy module: (_build "release" module) + cp target/release/lib{{module}}.dylib ${HOME}/.clua/{{module}}.so + _copy-so profile module: (_build profile module) #!/usr/bin/env sh if [ {{profile}} == "dev" ] diff --git a/lua/fs.example.lua b/lua/fs.example.lua index 169f2d1..0d27484 100644 --- a/lua/fs.example.lua +++ b/lua/fs.example.lua @@ -1,9 +1,11 @@ local fs = require("filesystem") -local dirs = fs.directory(".") +local dirs = fs.directory("/Users/kinch/Desktop/Onepunch-Man") for dir in dirs do - print(dir) + if dir:is_dir() then + print(dir) + end end --for dir in dirs do diff --git a/lua_modules/filesystem/src/lib.rs b/lua_modules/filesystem/src/lib.rs index afecf18..adc32da 100644 --- a/lua_modules/filesystem/src/lib.rs +++ b/lua_modules/filesystem/src/lib.rs @@ -5,12 +5,19 @@ use mlua::prelude::*; fn directory(lua: &Lua, path: String) -> LuaResult { let read_dir = std::fs::read_dir(path).unwrap(); - Ok(DirectoryFileTreeIter { read_dir }) + Ok(DirectoryFileTreeIter { + read_dir, + filters: vec![], + }) } #[mlua::lua_module] fn filesystem(lua: &Lua) -> LuaResult { let exports = lua.create_table()?; + let file_types = lua.create_table()?; + file_types.set("Directory", DirectoryType)?; + file_types.set("File", RegularFileType)?; exports.set("directory", lua.create_function(directory)?)?; + exports.set("file_types", file_types)?; Ok(exports) } diff --git a/lua_modules/filesystem/src/types/file_tree.rs b/lua_modules/filesystem/src/types/file_tree.rs index 3fb2626..b299d64 100644 --- a/lua_modules/filesystem/src/types/file_tree.rs +++ b/lua_modules/filesystem/src/types/file_tree.rs @@ -1,10 +1,51 @@ -use mlua::{MetaMethod, UserData, UserDataMethods}; +use crate::types::file_tree::ResourceType::{Directory, RegularFile}; +use mlua::{Function, MetaMethod, UserData, UserDataMethods}; use std::fs::{DirEntry, FileType, ReadDir}; use std::path::PathBuf; +pub enum ResourceType { + Directory(DirectoryType), + RegularFile(RegularFileType), +} + +pub struct DirectoryType; +pub struct RegularFileType; + +impl UserData for DirectoryType {} +impl UserData for RegularFileType {} + +impl From for ResourceType { + fn from(file_type: FileType) -> Self { + if file_type.is_file() { + RegularFile(RegularFileType) + } else { + Directory(DirectoryType) + } + } +} + +pub struct DynResource(Box); +pub struct ResourceFilter { + pub filter_fn: Box bool>, +} + pub trait Resource { fn path(&self) -> String; - fn file_type(&self) -> FileType; + fn file_type(&self) -> ResourceType; + fn is_dir(&self) -> bool { + if let Directory(_dir) = self.file_type() { + true + } else { + false + } + } + fn is_file(&self) -> bool { + if let RegularFile(_dir) = self.file_type() { + true + } else { + false + } + } } pub struct FileSystemResource { path: PathBuf, @@ -14,8 +55,8 @@ impl Resource for FileSystemResource { self.path.display().to_string() } - fn file_type(&self) -> FileType { - self.path.metadata().unwrap().file_type() + fn file_type(&self) -> ResourceType { + self.path.metadata().unwrap().file_type().into() } } @@ -23,6 +64,7 @@ pub trait FileTreeIter: Iterator {} pub struct DirectoryFileTreeIter { pub read_dir: ReadDir, + pub filters: Vec, } impl Iterator for DirectoryFileTreeIter { @@ -41,11 +83,20 @@ impl From for FileSystemResource { impl UserData for DirectoryFileTreeIter { fn add_methods<'lua, M: UserDataMethods<'lua, Self>>(methods: &mut M) { - methods.add_meta_method_mut(MetaMethod::Call, |lua, dir_iter, _: ()| Ok(dir_iter.next())) + methods.add_meta_method_mut(MetaMethod::Call, |lua, dir_iter, _: ()| Ok(dir_iter.next())); + // methods.add_method_mut("filter", |lua, dir_iter, lua_filter_fn: Function| { + // let filter = ResourceFilter { + // filter_fn: Box::new(move |entry| lua_filter_fn.call(()).unwrap()), + // }; + // dir_iter.filters.push(filter); + // Ok(()) + // }) } } impl UserData for FileSystemResource { fn add_methods<'lua, M: UserDataMethods<'lua, Self>>(methods: &mut M) { - methods.add_meta_method(MetaMethod::ToString, |lua, fsr, _: ()| Ok(fsr.path())) + methods.add_meta_method(MetaMethod::ToString, |lua, fsr, _: ()| Ok(fsr.path())); + methods.add_method("is_dir", |lua, fsr, _: ()| Ok(fsr.is_dir())); + methods.add_method("is_file", |lua, fsr, _: ()| Ok(fsr.is_file())); } }