filesystem/fake/
tempdir.rs1use std::path::{Path, PathBuf};
2use std::sync::{Mutex, Weak};
3
4use rand;
5use rand::Rng;
6
7use TempDir;
8
9use super::Registry;
10
11const SUFFIX_LENGTH: usize = 10;
12
13#[derive(Debug, Clone)]
14pub struct FakeTempDir {
15 registry: Weak<Mutex<Registry>>,
16 path: PathBuf,
17}
18
19impl FakeTempDir {
20 pub fn new(registry: Weak<Mutex<Registry>>, base: &Path, prefix: &str) -> Self {
21 let mut rng = rand::thread_rng();
22 let suffix: String = rng.gen_ascii_chars().take(SUFFIX_LENGTH).collect();
23 let name = format!("{}_{}", prefix, suffix);
24 let path = base.join(prefix).join(name);
25
26 FakeTempDir {
27 registry: registry,
28 path: path,
29 }
30 }
31}
32
33impl TempDir for FakeTempDir {
34 fn path(&self) -> &Path {
35 self.path.as_ref()
36 }
37}
38
39impl Drop for FakeTempDir {
40 fn drop(&mut self) {
41 if let Some(registry) = self.registry.upgrade() {
42 let _ = registry.lock().unwrap().remove_dir_all(&self.path);
43 }
44 }
45}