actix_tower 0.1.2

Modern extensions for Actix Web — Tower compatibility, ergonomic extractors, and production-ready middleware.
Documentation
use actix_tower::prelude::*;
use serde::{Deserialize, Serialize};

#[derive(Deserialize, Serialize)]
struct Pagination {
    page: u32,
    per_page: u32,
}

impl Validator for Pagination {
    fn validate(&self) -> Result<(), String> {
        in_range(self.page, 1, 1000, "page")?;
        in_range(self.per_page, 1, 100, "per_page")?;
        Ok(())
    }
}

async fn list_items(ValidatedQuery(pagination): ValidatedQuery<Pagination>) -> impl Responder {
    ApiResponse::ok(serde_json::json!({
        "page": pagination.page,
        "per_page": pagination.per_page,
        "items": [],
    }))
}

#[actix_web::main]
async fn main() -> std::io::Result<()> {
    HttpServer::new(|| App::new().route("/items", web::get().to(list_items)))
        .bind("127.0.0.1:8080")?
        .run()
        .await
}