1use futures::StreamExt; use 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}