/ crates / copy-artifacts / src / main.rs
main.rs
 1  use arroyo_storage::StorageProvider;
 2  use std::env;
 3  use std::path::PathBuf;
 4  use std::str::FromStr;
 5  
 6  fn main() {
 7      let args: Vec<_> = env::args().collect();
 8  
 9      if args.len() < 3 {
10          panic!("Usage ./copy_artifacts src.. dst");
11      }
12  
13      let srcs = &args[1..args.len() - 1];
14      let dst = &args[args.len() - 1];
15  
16      // TODO: stream the data instead of materializing it all in memory
17      let rt = tokio::runtime::Builder::new_current_thread()
18          .enable_all()
19          .build()
20          .unwrap();
21      rt.block_on(async {
22          let futures: Vec<_> = srcs
23              .iter()
24              .map(|src| {
25                  let src = src.clone();
26                  let name = src.split('/').last().unwrap();
27                  let dst = PathBuf::from_str(dst).unwrap().join(name);
28                  tokio::spawn(async move {
29                      let data: Vec<u8> = StorageProvider::get_url(&src)
30                          .await
31                          .unwrap_or_else(|_| panic!("Failed to download {}", src))
32                          .into();
33  
34                      tokio::fs::write(&dst, data).await.unwrap();
35                      println!("Downloaded {}", src);
36                  })
37              })
38              .collect();
39  
40          for f in futures {
41              f.await.unwrap();
42          }
43      });
44  }