diff options
author | Vika <vika@fireburn.ru> | 2024-08-04 07:46:46 +0300 |
---|---|---|
committer | Vika <vika@fireburn.ru> | 2024-08-04 07:46:46 +0300 |
commit | 63f56b43e72a602c765f44b71df6615bd5ce139b (patch) | |
tree | 8b346b40ac8e1f515444d60e16dae302f8253ace /util/src/lib.rs | |
parent | 845d0610441c474a7e3805be4016c965a3526c3c (diff) | |
download | kittybox-63f56b43e72a602c765f44b71df6615bd5ce139b.tar.zst |
kittybox-util: move out fs module
Diffstat (limited to 'util/src/lib.rs')
-rw-r--r-- | util/src/lib.rs | 59 |
1 files changed, 1 insertions, 58 deletions
diff --git a/util/src/lib.rs b/util/src/lib.rs index c49bdf5..c840e59 100644 --- a/util/src/lib.rs +++ b/util/src/lib.rs @@ -63,61 +63,4 @@ pub mod queue; #[cfg(feature = "fs")] /// Commonly-used operations with the file system in Kittybox's /// underlying storage mechanisms. -pub mod fs { - use std::io::{self, Result}; - use std::path::{Path, PathBuf}; - use rand::{Rng, distributions::Alphanumeric}; - use tokio::fs; - - /// Create a temporary file named `temp.[a-zA-Z0-9]{length}` in - /// the given location and immediately open it. Returns the - /// filename and the corresponding file handle. It is the caller's - /// responsibility to clean up the temporary file when it is no - /// longer needed. - /// - /// Uses [`OpenOptions::create_new`][fs::OpenOptions::create_new] - /// to detect filename collisions, in which case it will - /// automatically retry until the operation succeeds. - /// - /// # Errors - /// - /// Returns the underlying [`io::Error`] if the operation fails - /// due to reasons other than filename collision. - pub async fn mktemp<T, B>(dir: T, basename: B, length: usize) -> Result<(PathBuf, fs::File)> - where - T: AsRef<Path>, - B: Into<Option<&'static str>> - { - let dir = dir.as_ref(); - let basename = basename.into().unwrap_or(""); - fs::create_dir_all(dir).await?; - - loop { - let filename = dir.join(format!( - "{}{}{}", - basename, - if basename.is_empty() { "" } else { "." }, - { - let string = rand::thread_rng() - .sample_iter(&Alphanumeric) - .take(length) - .collect::<Vec<u8>>(); - String::from_utf8(string).unwrap() - } - )); - - match fs::OpenOptions::new() - .create_new(true) - .write(true) - .open(&filename) - .await - { - Ok(file) => return Ok((filename, file)), - Err(err) => match err.kind() { - io::ErrorKind::AlreadyExists => continue, - _ => return Err(err) - } - } - } - } -} +pub mod fs; |