ugi 0.2.1

Runtime-agnostic Rust request client with HTTP/1.1, HTTP/2, HTTP/3, H2C, WebSocket, SSE, and gRPC support
Documentation
#[cfg(feature = "h2")]
use futures_lite::future::block_on;

#[cfg(feature = "h2")]
#[derive(Clone, Debug, serde::Serialize, serde::Deserialize)]
struct ListRequest {
    topic: String,
}

#[cfg(feature = "h2")]
#[derive(Clone, Debug, serde::Serialize, serde::Deserialize)]
struct Event {
    id: u64,
    message: String,
}

#[cfg(feature = "h2")]
fn main() -> Result<(), Box<dyn std::error::Error>> {
    block_on(async move {
        let client = ugi::Client::builder().http2_only().build()?;
        let call = client
            .grpc("https://grpc.example.com/stream.Events/List")
            .message(&ListRequest {
                topic: "orders".to_owned(),
            })?;
        let mut stream = call.send_streaming().await?;

        while let Some(event) = stream.next_message::<Event>().await? {
            println!("event#{} {}", event.id, event.message);
        }

        println!("{:?}", stream.status()?);
        Ok(())
    })
}

#[cfg(not(feature = "h2"))]
fn main() {
    eprintln!("This example requires the `h2` feature.");
}