Actix
Simple application
use actix_web::{web, App, HttpRequest, HttpServer, Responder}; async fn greet(req: HttpRequest) -> impl Responder { let name = req.match_info().get("name").unwrap_or("World"); format!("Hello {}!", &name) } #[actix_web::main] async fn main() -> std::io::Result<()> { HttpServer::new(|| { App::new() .route("/", web::get().to(greet)) .route("/{name}", web::get().to(greet)) }) .bind("127.0.0.1:8000")? .run() .await }
HttpServer
Listener for requests, maximum number of connections, TLS etc. All transport level concerns.
App
Where all the application logic lives, routing middleware, request handlers etc.
Main entry point to lib for easy testing
src/main.rs
use std::net::TcpListener; use zero2prod::run; #[actix_web::main] async fn main() -> std::io::Result<()> { let listener = TcpListener::bind("127.0.0.1:0").expect("Failed to bind host"); run(listener)?.await }
lib.rs
src/lib.rs
#![allow(unused)] fn main() { pub fn run(listener: TcpListener) -> Result<Server, std::io::Error> { let server = HttpServer::new(|| { App::new() .route("/health_check", web::get().to(health_check)) }) .listen(listener)? .run(); Ok(server) } }