Add tempdir support

This commit is contained in:
lumi 2025-06-27 03:53:08 +10:00
parent 0c4639c3e9
commit cdfb2522ac
Signed by: luaneko
GPG Key ID: 406809B8763FF07A
4 changed files with 64 additions and 1 deletions

20
Cargo.lock generated
View File

@ -579,6 +579,12 @@ dependencies = [
"windows-sys 0.60.2", "windows-sys 0.60.2",
] ]
[[package]]
name = "fastrand"
version = "2.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be"
[[package]] [[package]]
name = "flate2" name = "flate2"
version = "1.1.2" version = "1.1.2"
@ -1049,6 +1055,7 @@ dependencies = [
"luaffi", "luaffi",
"luajit", "luajit",
"sysexits", "sysexits",
"tempfile",
"thiserror", "thiserror",
"tokio", "tokio",
"walkdir", "walkdir",
@ -1732,6 +1739,19 @@ version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "198f60d1f7f003f168507691e42d082df109ef0f05c6fd006e22528371a5f1b4" checksum = "198f60d1f7f003f168507691e42d082df109ef0f05c6fd006e22528371a5f1b4"
[[package]]
name = "tempfile"
version = "3.20.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e8a64e3985349f2441a1a9ef0b853f869006c3855f2cda6862a94d26ebb9d6a1"
dependencies = [
"fastrand",
"getrandom 0.3.3",
"once_cell",
"rustix",
"windows-sys 0.59.0",
]
[[package]] [[package]]
name = "thiserror" name = "thiserror"
version = "2.0.12" version = "2.0.12"

View File

@ -9,7 +9,7 @@ repository.workspace = true
[features] [features]
task = ["tokio/rt", "tokio/time"] task = ["tokio/rt", "tokio/time"]
fs = ["tokio/fs", "dep:walkdir", "dep:globset"] fs = ["tokio/fs", "dep:walkdir", "dep:globset", "dep:tempfile"]
net = ["tokio/net"] net = ["tokio/net"]
[dependencies] [dependencies]
@ -18,6 +18,7 @@ globset = { version = "0.4.16", optional = true }
luaffi = { path = "../luaffi" } luaffi = { path = "../luaffi" }
luajit = { path = "../luajit" } luajit = { path = "../luajit" }
sysexits = "0.9.0" sysexits = "0.9.0"
tempfile = { version = "3.20.0", optional = true }
thiserror = "2.0.12" thiserror = "2.0.12"
tokio = { version = "1.45.1" } tokio = { version = "1.45.1" }
walkdir = { version = "2.5.0", optional = true } walkdir = { version = "2.5.0", optional = true }

View File

@ -98,6 +98,14 @@ impl lb_fslib {
prefix, prefix,
}) })
} }
pub extern "Lua-C" fn temp_dir(&self) -> Result<lb_temp_dir> {
Ok(tempfile::tempdir()?.into())
}
pub extern "Lua-C" fn temp_dir_in(&self, path: &str) -> Result<lb_temp_dir> {
Ok(tempfile::tempdir_in(path)?.into())
}
} }
/// Iterator over the entries in a directory. /// Iterator over the entries in a directory.
@ -401,3 +409,20 @@ impl lb_glob_dir {
Ok(None) Ok(None)
} }
} }
/// Directory in the filesystem that is automatically deleted when it is garbage-collected.
#[derive(Debug, From)]
#[cdef]
pub struct lb_temp_dir(#[opaque] tempfile::TempDir);
#[metatype]
impl lb_temp_dir {
pub extern "Lua-C" fn path(&self) -> String {
self.0.path().to_string_lossy().into()
}
#[tostring]
pub extern "Lua" fn tostring(&self) -> String {
self.path()
}
}

17
crates/lb/tests/fs.lua Normal file
View File

@ -0,0 +1,17 @@
local ok, fs = pcall(require, "lb:fs")
if not ok then return end
describe("temp files", function()
test("temp_dir cleans itself", function()
local path
do
local dir = fs:temp_dir()
path = dir:path()
assert(path and path ~= "")
fs:write(path .. "/test.txt", "test file")
assert(fs:read(path .. "/test.txt") == "test file")
end
collectgarbage()
assert(not pcall(fs.read, fs, path .. "/test.txt"))
end)
end)