91 lines
2.4 KiB
Rust
91 lines
2.4 KiB
Rust
use super::*;
|
|
use luaffi::{cdef, metatype};
|
|
use std::cell::RefCell;
|
|
use walkdir::{DirEntry, IntoIter};
|
|
|
|
/// Iterator for recursively descending into a directory.
|
|
#[derive(Debug)]
|
|
#[cdef]
|
|
pub struct lb_walk_dir(#[opaque] RefCell<IntoIter>);
|
|
|
|
#[metatype]
|
|
impl lb_walk_dir {
|
|
pub(super) fn new(iter: IntoIter) -> Self {
|
|
Self(RefCell::new(iter))
|
|
}
|
|
|
|
/// Returns the next entry in the walk, or `nil` if there are no more entries.
|
|
///
|
|
/// # Errors
|
|
///
|
|
/// This function may throw if the directory could not be read.
|
|
#[call]
|
|
pub extern "Lua-C" fn next(&self) -> Result<Option<lb_walk_dir_entry>> {
|
|
Ok(self
|
|
.0
|
|
.try_borrow_mut()?
|
|
.next()
|
|
.transpose()?
|
|
.map(lb_walk_dir_entry::new))
|
|
}
|
|
}
|
|
|
|
/// Entry inside of a directory on the filesystem obtained from [`lb_walk_dir`].
|
|
#[derive(Debug)]
|
|
#[cdef]
|
|
pub struct lb_walk_dir_entry(#[opaque] DirEntry);
|
|
|
|
#[metatype]
|
|
impl lb_walk_dir_entry {
|
|
pub(super) fn new(entry: DirEntry) -> Self {
|
|
Self(entry)
|
|
}
|
|
|
|
/// Returns the full path of this entry.
|
|
pub extern "Lua-C" fn path(&self) -> String {
|
|
self.0.path().to_string_lossy().into()
|
|
}
|
|
|
|
/// Returns the file name of this entry.
|
|
pub extern "Lua-C" fn name(&self) -> String {
|
|
self.0.file_name().to_string_lossy().into()
|
|
}
|
|
|
|
/// Returns the type of this entry.
|
|
pub extern "Lua-C" fn r#type(&self) -> lb_file_type {
|
|
lb_file_type::new(self.0.file_type())
|
|
}
|
|
|
|
/// Returns the metadata for this entry.
|
|
///
|
|
/// # Errors
|
|
///
|
|
/// This function may throw if the metadata could not be retrieved.
|
|
pub extern "Lua-C" fn metadata(&self) -> Result<lb_file_meta> {
|
|
Ok(lb_file_meta::new(self.0.metadata()?))
|
|
}
|
|
|
|
/// Returns `true` if this entry was created from a symbolic link.
|
|
pub extern "Lua-C" fn is_symlink(&self) -> bool {
|
|
self.0.path_is_symlink()
|
|
}
|
|
|
|
/// Returns the depth of this entry in the walk.
|
|
pub extern "Lua-C" fn depth(&self) -> u32 {
|
|
self.0.depth() as u32
|
|
}
|
|
|
|
/// Returns the inode number for this entry.
|
|
#[cfg(unix)]
|
|
pub extern "Lua-C" fn ino(&self) -> u64 {
|
|
use walkdir::DirEntryExt;
|
|
self.0.ino()
|
|
}
|
|
|
|
/// Returns the full path of this entry.
|
|
#[tostring]
|
|
pub extern "Lua" fn tostring(&self) -> String {
|
|
self.path()
|
|
}
|
|
}
|