filesystem/fake/
tempdir.rs

1use 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}