summaryrefslogtreecommitdiff
path: root/vendor/tempfile/src/env.rs
diff options
context:
space:
mode:
authormo khan <mo@mokhan.ca>2025-07-02 18:36:06 -0600
committermo khan <mo@mokhan.ca>2025-07-02 18:36:06 -0600
commit8cdfa445d6629ffef4cb84967ff7017654045bc2 (patch)
tree22f0b0907c024c78d26a731e2e1f5219407d8102 /vendor/tempfile/src/env.rs
parent4351c74c7c5f97156bc94d3a8549b9940ac80e3f (diff)
chore: add vendor directory
Diffstat (limited to 'vendor/tempfile/src/env.rs')
-rw-r--r--vendor/tempfile/src/env.rs44
1 files changed, 44 insertions, 0 deletions
diff --git a/vendor/tempfile/src/env.rs b/vendor/tempfile/src/env.rs
new file mode 100644
index 00000000..b9574510
--- /dev/null
+++ b/vendor/tempfile/src/env.rs
@@ -0,0 +1,44 @@
+use std::env;
+use std::path::{Path, PathBuf};
+
+// Once rust 1.70 is wide-spread (Debian stable), we can use OnceLock from stdlib.
+use once_cell::sync::OnceCell as OnceLock;
+
+static DEFAULT_TEMPDIR: OnceLock<PathBuf> = OnceLock::new();
+
+/// Override the default temporary directory (defaults to [`std::env::temp_dir`]). This function
+/// changes the _global_ default temporary directory for the entire program and should not be called
+/// except in exceptional cases where it's not configured correctly by the platform. Applications
+/// should first check if the path returned by [`env::temp_dir`] is acceptable.
+///
+/// Only the first call to this function will succeed. All further calls will fail with `Err(path)`
+/// where `path` is previously set default temporary directory override.
+///
+/// **NOTE:** This function does not check if the specified directory exists and/or is writable.
+pub fn override_temp_dir(path: &Path) -> Result<(), PathBuf> {
+ let mut we_set = false;
+ let val = DEFAULT_TEMPDIR.get_or_init(|| {
+ we_set = true;
+ path.to_path_buf()
+ });
+ if we_set {
+ Ok(())
+ } else {
+ Err(val.to_owned())
+ }
+}
+
+/// Returns the default temporary directory, used for both temporary directories and files if no
+/// directory is explicitly specified.
+///
+/// This function simply delegates to [`std::env::temp_dir`] unless the default temporary directory
+/// has been override by a call to [`override_temp_dir`].
+///
+/// **NOTE:** This function does check if the returned directory exists and/or is writable.
+pub fn temp_dir() -> PathBuf {
+ DEFAULT_TEMPDIR
+ .get()
+ .map(|p| p.to_owned())
+ // Don't cache this in case the user uses std::env::set to change the temporary directory.
+ .unwrap_or_else(env::temp_dir)
+}