comtrya_lib/atoms/directory/
create.rs

1use crate::atoms::Outcome;
2
3use super::super::Atom;
4use std::path::PathBuf;
5
6pub struct Create {
7    pub path: PathBuf,
8}
9
10impl std::fmt::Display for Create {
11    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
12        write!(
13            f,
14            "The directory {} needs to be created",
15            self.path.display(),
16        )
17    }
18}
19
20impl Atom for Create {
21    fn plan(&self) -> anyhow::Result<Outcome> {
22        Ok(Outcome {
23            side_effects: vec![],
24            should_run: !self.path.exists(),
25        })
26    }
27
28    fn execute(&mut self) -> anyhow::Result<()> {
29        std::fs::create_dir_all(&self.path)?;
30
31        Ok(())
32    }
33}
34
35#[cfg(test)]
36mod tests {
37    use std::env::temp_dir;
38
39    use super::*;
40    use pretty_assertions::assert_eq;
41
42    #[test]
43    fn it_can_plan() {
44        let atom = Create {
45            path: std::path::PathBuf::from("/some-random-path"),
46        };
47        assert_eq!(true, atom.plan().unwrap().should_run);
48
49        let temp = temp_dir();
50        let atom = Create { path: temp };
51        assert_eq!(false, atom.plan().unwrap().should_run);
52    }
53
54    #[test]
55    fn it_can_execute() {
56        let temp_dir = match tempfile::tempdir() {
57            std::result::Result::Ok(dir) => dir,
58            std::result::Result::Err(_) => {
59                assert_eq!(false, true);
60                return;
61            }
62        };
63
64        let mut atom = Create {
65            path: temp_dir.path().join("create-me"),
66        };
67
68        assert_eq!(false, temp_dir.path().join("create-me").exists());
69
70        assert_eq!(true, atom.execute().is_ok());
71        assert_eq!(false, atom.plan().unwrap().should_run);
72
73        assert_eq!(true, temp_dir.path().join("create-me").is_dir());
74    }
75}