Documentation
use http_body_util::BodyExt;
use http_pool::http2::Http2Pool;
use net_pool::backend::Address;
use net_pool::pool::Pool;
use std::sync::Arc;
use std::time::Duration;

#[tokio::main]
async fn main() {
    init_log();

    let use_tls = true;
    let uri = if use_tls {
        "https://nghttp2.org"
    } else {
        "http://nghttp2.org"
    };

    // 设置最大并发流为1
    let pool = Arc::new(http_pool::http2::Pool::new(
        "".to_string(),
        Arc::new(net_pool::strategy::CHStrategy::default()),
        Some(1),
    ));

    // 池里加bs
    pool.add_backend(Address::from(uri));

    // 设置最大数量
    pool.set_max_conn(Some(1));

    // 设置超时
    pool.set_keepalive(Some(Duration::from_secs(5)));

    // 是否使用tls
    pool.use_tls(use_tls);

    // 获取第一个连接,应该成功
    let mut r1 = pool.clone().get("").await;
    assert_eq!(r1.is_ok(), true);

    // 获取第二个应该会报池满了的错误
    let r2 = pool.clone().get("").await;
    assert_eq!(r2.is_err(), true);
    if let Err(net_pool::Error::PoolFull) = r2 {
    } else {
        assert!(false);
    }

    // 构造一个请求
    let req = http_pool::http2::request_builder(uri, hyper::Method::GET)
        .body(http_pool::body::empty())
        .unwrap();

    let rsp = r1.as_mut().unwrap().send_request(req).await.unwrap();
    let data = rsp.collect().await;
    match data {
        Err(e) => println!("request error:{:?}", e),
        Ok(data) => println!("request ok, data len:{}", data.to_bytes().len()),
    }

    assert_eq!(pool.get_cur_conn(), 1);
    pool.remove_backend(&Address::from(uri));
    assert_eq!(pool.get_cur_conn(), 0);
}

fn init_log() {
    #[cfg(feature = "tracing")]
    {
        tracing_subscriber::fmt()
            .with_max_level(tracing::Level::TRACE)
            .init();
    }
}