lune/src/lib/globals/fs.rs

114 lines
3.2 KiB
Rust
Raw Normal View History

2023-01-19 01:47:14 +00:00
use std::path::{PathBuf, MAIN_SEPARATOR};
use mlua::{Lua, Result, UserData, UserDataMethods};
use tokio::fs;
2023-01-21 02:05:51 +00:00
pub struct Fs();
2023-01-19 01:47:14 +00:00
2023-01-21 02:05:51 +00:00
impl Fs {
2023-01-19 01:47:14 +00:00
pub fn new() -> Self {
Self()
}
}
impl Default for Fs {
fn default() -> Self {
Self::new()
}
}
2023-01-21 02:05:51 +00:00
impl UserData for Fs {
2023-01-19 01:47:14 +00:00
fn add_methods<'lua, M: UserDataMethods<'lua, Self>>(methods: &mut M) {
methods.add_async_function("readFile", fs_read_file);
methods.add_async_function("readDir", fs_read_dir);
methods.add_async_function("writeFile", fs_write_file);
methods.add_async_function("writeDir", fs_write_dir);
methods.add_async_function("removeFile", fs_remove_file);
methods.add_async_function("removeDir", fs_remove_dir);
methods.add_async_function("isFile", fs_is_file);
methods.add_async_function("isDir", fs_is_dir);
}
}
async fn fs_read_file(_: &Lua, path: String) -> Result<String> {
2023-01-19 02:11:47 +00:00
fs::read_to_string(&path)
2023-01-19 01:47:14 +00:00
.await
2023-01-19 02:11:47 +00:00
.map_err(mlua::Error::external)
2023-01-19 01:47:14 +00:00
}
async fn fs_read_dir(_: &Lua, path: String) -> Result<Vec<String>> {
let mut dir_strings = Vec::new();
let mut dir = fs::read_dir(&path).await.map_err(mlua::Error::external)?;
while let Some(dir_entry) = dir.next_entry().await.map_err(mlua::Error::external)? {
if let Some(dir_path_str) = dir_entry.path().to_str() {
dir_strings.push(dir_path_str.to_owned());
} else {
return Err(mlua::Error::RuntimeError(format!(
"File path could not be converted into a string: '{}'",
dir_entry.path().display()
)));
}
}
let mut dir_string_prefix = path;
if !dir_string_prefix.ends_with(MAIN_SEPARATOR) {
dir_string_prefix.push(MAIN_SEPARATOR);
}
let dir_strings_no_prefix = dir_strings
.iter()
.map(|inner_path| {
inner_path
.trim()
.strip_prefix(&dir_string_prefix)
.unwrap()
.to_owned()
})
.collect::<Vec<_>>();
Ok(dir_strings_no_prefix)
}
async fn fs_write_file(_: &Lua, (path, contents): (String, String)) -> Result<()> {
2023-01-19 02:11:47 +00:00
fs::write(&path, &contents)
2023-01-19 01:47:14 +00:00
.await
2023-01-19 02:11:47 +00:00
.map_err(mlua::Error::external)
2023-01-19 01:47:14 +00:00
}
async fn fs_write_dir(_: &Lua, path: String) -> Result<()> {
2023-01-19 02:11:47 +00:00
fs::create_dir_all(&path)
2023-01-19 01:47:14 +00:00
.await
2023-01-19 02:11:47 +00:00
.map_err(mlua::Error::external)
2023-01-19 01:47:14 +00:00
}
async fn fs_remove_file(_: &Lua, path: String) -> Result<()> {
2023-01-19 02:11:47 +00:00
fs::remove_file(&path).await.map_err(mlua::Error::external)
2023-01-19 01:47:14 +00:00
}
async fn fs_remove_dir(_: &Lua, path: String) -> Result<()> {
2023-01-19 02:11:47 +00:00
fs::remove_dir_all(&path)
2023-01-19 01:47:14 +00:00
.await
2023-01-19 02:11:47 +00:00
.map_err(mlua::Error::external)
2023-01-19 01:47:14 +00:00
}
async fn fs_is_file(_: &Lua, path: String) -> Result<bool> {
let path = PathBuf::from(path);
if path.exists() {
Ok(fs::metadata(path)
.await
.map_err(mlua::Error::external)?
.is_file())
} else {
Ok(false)
}
}
async fn fs_is_dir(_: &Lua, path: String) -> Result<bool> {
let path = PathBuf::from(path);
if path.exists() {
Ok(fs::metadata(path)
.await
.map_err(mlua::Error::external)?
.is_dir())
} else {
Ok(false)
}
}