Documentation
use std::{net::SocketAddr, sync::Arc};

use crate::{CertLoader, LoadCert, Result, Route};

mod h1;
mod h2;
mod h3;

pub async fn srv<D: LoadCert>(
  route: Arc<Route>,
  cert_loader: Arc<CertLoader<D>>,
  h1_addr: SocketAddr,
  h2_addr: SocketAddr,
  h3_addr: SocketAddr,
) -> Result<()> {
  let h1_srv = h1::srv(h1_addr, route.clone());
  let h2_srv = h2::srv(h2_addr, route.clone(), cert_loader.clone());
  let h3_srv = h3::srv(h3_addr, route, cert_loader);

  println!("h1 {h1_addr}\nh2 {h2_addr}\nh3 {h3_addr}");
  xerr::log!(tokio::try_join!(h1_srv, h2_srv, h3_srv));
  Ok(())
}