use std::mem::ManuallyDrop; use std::path::Path; use tempfile::TempDir; /// This is used to avoid TempDir being dropped on error paths unintentionally. #[derive(Debug)] pub struct MaybeTempDir { dir: ManuallyDrop, // Whether the TempDir should be deleted on drop. keep: bool, } impl Drop for MaybeTempDir { fn drop(&mut self) { // SAFETY: We are in the destructor, and no further access will // occur. let dir = unsafe { ManuallyDrop::take(&mut self.dir) }; if self.keep { dir.into_path(); } } } impl AsRef for MaybeTempDir { fn as_ref(&self) -> &Path { self.dir.path() } } impl MaybeTempDir { pub fn new(dir: TempDir, keep_on_drop: bool) -> MaybeTempDir { MaybeTempDir { dir: ManuallyDrop::new(dir), keep: keep_on_drop } } }