aboutsummaryrefslogtreecommitdiff
path: root/src/main.rs
blob: da1ae1f807b9f88fbb103b40fbc101d427d24df8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
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<PathBuf>,

    /// The URLs to download
    urls: Vec<Uri>,
}

#[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(())
}