can filter dirs

develop
Kinch 2023-09-17 18:39:48 +02:00
parent 938da96c70
commit 7fc57fce47
5 changed files with 75 additions and 11 deletions

4
Cargo.lock generated
View File

@ -155,9 +155,9 @@ dependencies = [
[[package]] [[package]]
name = "syn" name = "syn"
version = "2.0.35" version = "2.0.36"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "59bf04c28bee9043ed9ea1e41afc0552288d3aba9c6efdd78903b802926f4879" checksum = "91e02e55d62894af2a08aca894c6577281f76769ba47c94d5756bec8ac6e7373"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",

View File

@ -3,10 +3,14 @@ set dotenv-load := true
run-fs: (lua "fs.example.lua") run-fs: (lua "fs.example.lua")
build-filesystem: (_copy-so "dev" "filesystem") build-filesystem: (_copy-so "dev" "filesystem")
deploy-fs: (_deploy "filesystem")
lua file: lua file:
LUA_CPATH=c_modules/?.so lua 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) _copy-so profile module: (_build profile module)
#!/usr/bin/env sh #!/usr/bin/env sh
if [ {{profile}} == "dev" ] if [ {{profile}} == "dev" ]

View File

@ -1,9 +1,11 @@
local fs = require("filesystem") local fs = require("filesystem")
local dirs = fs.directory(".") local dirs = fs.directory("/Users/kinch/Desktop/Onepunch-Man")
for dir in dirs do for dir in dirs do
if dir:is_dir() then
print(dir) print(dir)
end
end end
--for dir in dirs do --for dir in dirs do

View File

@ -5,12 +5,19 @@ use mlua::prelude::*;
fn directory(lua: &Lua, path: String) -> LuaResult<DirectoryFileTreeIter> { fn directory(lua: &Lua, path: String) -> LuaResult<DirectoryFileTreeIter> {
let read_dir = std::fs::read_dir(path).unwrap(); let read_dir = std::fs::read_dir(path).unwrap();
Ok(DirectoryFileTreeIter { read_dir }) Ok(DirectoryFileTreeIter {
read_dir,
filters: vec![],
})
} }
#[mlua::lua_module] #[mlua::lua_module]
fn filesystem(lua: &Lua) -> LuaResult<LuaTable> { fn filesystem(lua: &Lua) -> LuaResult<LuaTable> {
let exports = lua.create_table()?; 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("directory", lua.create_function(directory)?)?;
exports.set("file_types", file_types)?;
Ok(exports) Ok(exports)
} }

View File

@ -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::fs::{DirEntry, FileType, ReadDir};
use std::path::PathBuf; 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<FileType> for ResourceType {
fn from(file_type: FileType) -> Self {
if file_type.is_file() {
RegularFile(RegularFileType)
} else {
Directory(DirectoryType)
}
}
}
pub struct DynResource(Box<dyn Resource>);
pub struct ResourceFilter {
pub filter_fn: Box<dyn Fn(DynResource) -> bool>,
}
pub trait Resource { pub trait Resource {
fn path(&self) -> String; 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 { pub struct FileSystemResource {
path: PathBuf, path: PathBuf,
@ -14,8 +55,8 @@ impl Resource for FileSystemResource {
self.path.display().to_string() self.path.display().to_string()
} }
fn file_type(&self) -> FileType { fn file_type(&self) -> ResourceType {
self.path.metadata().unwrap().file_type() self.path.metadata().unwrap().file_type().into()
} }
} }
@ -23,6 +64,7 @@ pub trait FileTreeIter<RES: Resource>: Iterator<Item = RES> {}
pub struct DirectoryFileTreeIter { pub struct DirectoryFileTreeIter {
pub read_dir: ReadDir, pub read_dir: ReadDir,
pub filters: Vec<ResourceFilter>,
} }
impl Iterator for DirectoryFileTreeIter { impl Iterator for DirectoryFileTreeIter {
@ -41,11 +83,20 @@ impl From<DirEntry> for FileSystemResource {
impl UserData for DirectoryFileTreeIter { impl UserData for DirectoryFileTreeIter {
fn add_methods<'lua, M: UserDataMethods<'lua, Self>>(methods: &mut M) { 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 { impl UserData for FileSystemResource {
fn add_methods<'lua, M: UserDataMethods<'lua, Self>>(methods: &mut M) { 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()));
} }
} }