use futures::{stream, StreamExt}; use reqwest::Client; use std::path::PathBuf; use tokio::{fs::File, io::AsyncWriteExt}; type Result = std::result::Result>; pub async fn download_images(img_data: &Vec<(String, PathBuf)>) -> Result { let client = Client::builder().build()?; let futures = stream::iter(img_data.iter().map(|data| async { let (url, path) = data; let send_fut = client.get(url).send(); match send_fut.await { Ok(res) => match res.bytes().await { Ok(bytes) => { let mut file = File::create(path).await.unwrap(); file.write_all(&bytes).await.unwrap(); println!("{} bytes from {:?} to {:?}", bytes.len(), &url, &path); } Err(_) => eprintln!("Error reading bytes from {}", url), }, Err(_) => eprintln!("Error downloading {}", url), } })) .buffer_unordered(100) .collect::>(); futures.await; Ok(img_data.len()) }