Skip to content

Conversation

0x676e67
Copy link
Contributor

@0x676e67 0x676e67 commented Oct 20, 2023

From issue: #2997

Test Example:

#![deny(warnings)]
#![warn(rust_2018_idioms)]

use hyper::body::Buf;
use serde::Deserialize;

// A simple type alias so as to DRY.
type Result<T> = std::result::Result<T, Box<dyn std::error::Error + Send + Sync>>;

#[tokio::main]
async fn main() -> Result<()> {
    let url = "http://jsonplaceholder.typicode.com/users".parse().unwrap();
    let users = fetch_json(url).await?;
    // print users
    println!("users: {:#?}", users);

    // print the sum of ids
    let sum = users.iter().fold(0, |acc, user| acc + user.id);
    println!("sum of ids: {}", sum);
    Ok(())
}

async fn fetch_json(url: hyper::Uri) -> Result<Vec<User>> {
    let client = hyper::client::Builder::default()
        .pool_idle_timeout(Some(std::time::Duration::ZERO))
        .build_http::<hyper::Body>();

    // Fetch the url...
    let res = client.get(url).await?;

    // asynchronously aggregate the chunks of the body
    let body = hyper::body::aggregate(res).await?;

    // try to parse as json with serde_json
    let users = serde_json::from_reader(body.reader())?;

    Ok(users)
}

#[derive(Deserialize, Debug)]
struct User {
    id: i32,
    #[allow(unused)]
    name: String,
}

@seanmonstar seanmonstar merged commit 34d3800 into hyperium:0.14.x Oct 20, 2023
@0x676e67 0x676e67 deleted the patch-2 branch August 10, 2024 10:01
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants