trillium-http 1.0.0

the http implementation for the trillium toolkit
Documentation
use async_net::{TcpListener, TcpStream};
use futures_lite::prelude::*;
use std::sync::Arc;
use trillium_http::{Conn, HttpContext};

async fn handler(mut conn: Conn<TcpStream>) -> Conn<TcpStream> {
    conn.set_status(200);
    conn.set_response_body("ok");
    conn
}

pub fn main() {
    env_logger::init();

    smol::block_on(async move {
        let context = Arc::new(HttpContext::new());
        let port = std::env::var("PORT")
            .unwrap_or("8080".into())
            .parse::<u16>()
            .unwrap();

        let listener = TcpListener::bind(("0.0.0.0", port)).await.unwrap();
        let mut incoming = context.swansong().interrupt(listener.incoming());
        while let Some(Ok(stream)) = incoming.next().await {
            let context = Arc::clone(&context);
            smol::spawn(async move {
                match context.run(stream, handler).await {
                    Ok(Some(_)) => log::info!("upgrade"),
                    Ok(None) => log::info!("closing connection"),
                    Err(e) => log::error!("{:?}", e),
                }
            })
            .detach()
        }
    });
}