Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@PurpleBooth
Created April 16, 2020 18:13
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save PurpleBooth/c1267e52d51fb947d8452161cb37c476 to your computer and use it in GitHub Desktop.
Save PurpleBooth/c1267e52d51fb947d8452161cb37c476 to your computer and use it in GitHub Desktop.
use futures::future::join_all;
use futures::StreamExt;
use reqwest::Client;
use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize, Debug)]
struct ProjectsItem {
hash_id: String,
}
type ProjectsData = Vec<ProjectsItem>;
#[derive(Serialize, Deserialize, Debug)]
struct ProjectsResponse {
data: ProjectsData,
}
#[derive(Serialize, Deserialize, Debug)]
struct ProjectAsset {
image_url: String,
}
type ProjectAssets = Vec<ProjectAsset>;
#[derive(Serialize, Deserialize, Debug)]
struct ProjectResponse {
assets: ProjectAssets,
}
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let username = "anniehexample";
let projects_url = format!(
"https://example.com/users/{}/projects.json",
username
);
let client = Client::new();
let project_list = client
.get(&projects_url)
.send()
.await?
.json::<ProjectsResponse>()
.await?;
println!("{:#?}", project_list);
let project_requests = project_list
.data
.into_iter()
.map(|project| {
let url = format!(
"https://example.com/projects/{}.json",
project.hash_id
);
client.get(&url).send()
})
.collect::<Vec<_>>();
let project_responses = join_all(project_requests)
.await
.into_iter()
.filter_map(Result::ok)
.map(|response| response.json::<ProjectResponse>());
let projects = join_all(project_responses).await;
println!("{:#?}", projects);
Ok(())
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment