mini-serve 0.6.0

An HTTP server: trie router, middleware, CORS, optional TLS. Built on hyper + tokio.
Documentation
use std::time::Duration;

use hyper::StatusCode;
use mini_serve::{RouteBuilder, handler};
use tokio::net::TcpListener;
use tokio::sync::oneshot;

#[tokio::test]
async fn run_serves_requests_until_shutdown_then_returns() {
	let app = RouteBuilder::stateless()
		.get("/health", handler(|_req, _state| async {
			mini_serve::json(StatusCode::OK, &serde_json::json!({"ok": true}))
		}))
		.seal();

	let listener = TcpListener::bind("127.0.0.1:0").await.unwrap();
	let addr = listener.local_addr().unwrap();
	let (shutdown_tx, shutdown_rx) = oneshot::channel::<()>();

	let run_task = tokio::spawn(async move {
		app.run(listener, async move {
			let _ = shutdown_rx.await;
		})
		.await
	});

	let resp = reqwest::get(format!("http://{addr}/health")).await.unwrap();
	assert_eq!(resp.status(), StatusCode::OK);

	shutdown_tx.send(()).unwrap();
	let result = tokio::time::timeout(Duration::from_secs(2), run_task)
		.await
		.expect("run() did not return after shutdown")
		.expect("run task panicked");
	assert!(result.is_ok());
}