comtrya_lib/atoms/directory/
create.rs1use 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}