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 }