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); #[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> { 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 { 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() } }