can filter dirs
parent
938da96c70
commit
7fc57fce47
|
|
@ -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",
|
||||
|
|
|
|||
4
justfile
4
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" ]
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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()));
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue