can filter dirs
parent
938da96c70
commit
7fc57fce47
|
|
@ -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",
|
||||||
|
|
|
||||||
4
justfile
4
justfile
|
|
@ -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" ]
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
print(dir)
|
if dir:is_dir() then
|
||||||
|
print(dir)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
--for dir in dirs do
|
--for dir in dirs do
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue