use std::mem; use std::path::PathBuf; use anyhow::Error; use hyper::Uri; use structopt::StructOpt; mod download; use download::download; #[derive(StructOpt, Debug)] struct Args { /// Specify output filename (will cause an error if multiple URLs are given) #[structopt(short = "O", long)] output_document: Option, /// The URLs to download urls: Vec, } #[tokio::main] async fn main() -> Result<(), Error> { let (args, urls) = { let mut args: Args = Args::from_args(); let urls = mem::take(&mut args.urls); (args, urls) }; if urls.len() != 1 && args.output_document.is_some() { panic!("can't use the same output file for multiple URLs!") } let download_handles = urls .into_iter() .map(|url| download(url, &args)); let downloads = futures::future::join_all(download_handles); let _downloads = downloads.await; Ok(()) }