move_it/work/
action.rs

1use futures::StreamExt; // 0.3.1
2
3use crate::result::Result;
4use crate::work::Work;
5use log::*;
6use tokio::fs;
7
8impl<'a> Work<'a> {
9    pub fn echo(self, target: impl Into<String>) -> Result<Work<'a>> {
10        let target = target.into();
11
12        self.add_work(move |elements| {
13            elements
14                .filter_map(move |element| {
15                    let target = target.clone();
16                    async move {
17                        println!(
18                            "{:?} -> {:?}",
19                            element.get_file().path(),
20                            element.expand(target).await.unwrap()
21                        );
22
23                        Some(element)
24                    }
25                })
26                .boxed()
27        })
28    }
29
30    pub fn copy(self, target: impl Into<String>) -> Result<Work<'a>> {
31        let target = target.into();
32
33        self.add_work(move |elements| {
34            elements
35                .filter_map(move |element| {
36                    let target = target.clone();
37                    async move {
38                        let from = element.get_file().path();
39                        let to = std::path::PathBuf::from(element.expand(target).await.ok()?);
40
41                        info!("COPY: {:?} -> {:?}", &from, &to);
42                        if let Some(parent) = to.parent() {
43                            if let Err(e) = fs::create_dir_all(parent).await {
44                                error!("COPY: Could not create dir {:?}: {:?}", parent, e);
45                            };
46                        }
47
48                        if let Err(e) = fs::copy(&from, &to).await {
49                            error!("COPY: Could not move from {:?} to {:?}: {:?}", from, to, e);
50                        };
51
52                        Some(element)
53                    }
54                })
55                .boxed()
56        })
57    }
58
59    pub fn r#move(self, target: impl Into<String>) -> Result<Work<'a>> {
60        let target = target.into();
61
62        self.add_work(move |elements| {
63            elements
64                .filter_map(move |element| {
65                    let target = target.clone();
66                    async move {
67                        let from = element.get_file().path();
68                        let to = std::path::PathBuf::from(element.expand(target).await.ok()?);
69
70                        info!("MOVE: {:?} -> {:?}", from, to);
71
72                        if let Some(parent) = to.parent() {
73                            if let Err(e) = fs::create_dir_all(parent).await {
74                                error!("MOVE: Could not create dir {:?}: {:?}", parent, e);
75                            };
76                        }
77
78                        if let Err(e) = fs::rename(&from, &to).await {
79                            error!("MOVE: Could not move from {:?} to {:?}: {:?}", from, to, e);
80                        };
81
82                        Some(element)
83                    }
84                })
85                .boxed()
86        })
87    }
88}