use anyhow;
use kio;

use std::{io, net, time};

fn main() -> anyhow::Result<()> {
    kio::run(|kio| async { run_server(kio).await.unwrap() })
}

async fn run_server(mut kio: kio::Context) -> io::Result<()> {
    let mut socket = kio.listen("127.0.0.1:8080")?;

    loop {
        let conn = kio.accept(&mut socket).await?;
        kio.spawn(move |kio| async { run_conn(kio, conn).await.unwrap() });
    }
}

async fn run_conn(mut kio: kio::Context, mut conn: net::TcpStream) -> io::Result<()> {
    // Set up the connection limit
    let mut kio = kio.timeout(time::Duration::from_secs(5));
    let mut buffer = kio.buffer(4096);

    loop {
        let size = kio.read(&mut conn, &mut buffer).await?;
        if size == 0 {
            return Ok(());
        }

        kio.write_full(&mut conn, &buffer[..size]).await?;
    }
}
