Documentation
use net_relay::RelayExt;
use std::sync::Arc;
use std::time::Duration;
use http_pool::net_pool::{Address, CHStrategy, debug, Pool};

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

    if let Err(_e) = run().await {
        debug!("run error:{:?}", _e);
    }
}

async fn run() -> Result<(), net_relay::Error> {
    let mut relay = hrelay::http2::Relay::build(|b| {
        b.bind("0.0.0.0:3001")
            .relay_fn(hrelay::http2::default_relay_fn)
    })
    .map(|r| r)?;

    let pools = relay.pools();

    tokio::spawn(async move {
        tokio::time::sleep(Duration::from_secs(10)).await;
        let mut p = http_pool::http2::Pool::new(
            Arc::new(CHStrategy::default()),
            Some(20),
        );
        p.set_id("*");
        pools.add_pool(p);
        pools.add_backend("*", None, Address::from("127.0.0.1:30097"));
    });

    loop {
        tokio::select! {
            res = relay.run() => {
                return res;
            }
        };
    }
}

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