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]]
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",

View File

@ -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" ]

View File

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

View File

@ -5,12 +5,19 @@ use mlua::prelude::*;
fn directory(lua: &Lua, path: String) -> LuaResult<DirectoryFileTreeIter> {
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<LuaTable> {
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)
}

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::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 {
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<RES: Resource>: Iterator<Item = RES> {}
pub struct DirectoryFileTreeIter {
pub read_dir: ReadDir,
pub filters: Vec<ResourceFilter>,
}
impl Iterator for DirectoryFileTreeIter {
@ -41,11 +83,20 @@ impl From<DirEntry> 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()));
}
}