Axum
The paginator-axum crate provides query extractors and JSON responders for Axum.
Installation
Section titled “Installation”[dependencies]paginator-axum = "0.2.2"axum = "0.7"PaginationQuery Extractor
Section titled “PaginationQuery Extractor”Extract pagination parameters from query strings:
use axum::{Router, routing::get};use paginator_axum::{PaginationQuery, PaginatedJson};use serde::Serialize;
#[derive(Serialize)]struct User { id: u32, name: String,}
async fn get_users( PaginationQuery(params): PaginationQuery,) -> PaginatedJson<User> { let users = vec![ User { id: 1, name: "Alice".to_string() }, User { id: 2, name: "Bob".to_string() }, ];
PaginatedJson::new(users, ¶ms, 100)}
let app = Router::new().route("/users", get(get_users));Query Parameters
Section titled “Query Parameters”The extractor parses these query parameters:
| Parameter | Type | Default | Description |
|---|---|---|---|
page | u32 | 1 | Page number (1-indexed) |
per_page | u32 | 20 | Items per page (max: 100) |
sort_by | String | - | Field to sort by |
sort_direction | String | - | asc or desc |
filter | String[] | - | Filters in field:operator:value format |
search | String | - | Search query |
search_fields | String | - | Comma-separated fields to search |
Example Requests
Section titled “Example Requests”GET /users?page=2&per_page=20GET /users?sort_by=name&sort_direction=ascGET /users?filter=status:eq:active&filter=age:gt:18GET /users?search=john&search_fields=name,emailGET /users?filter=role:in:admin,moderator&sort_by=created_at&sort_direction=descFilter Format
Section titled “Filter Format”Filters use the format field:operator:value:
status:eq:active # Equalage:gt:18 # Greater thanage:between:18,65 # Betweenrole:in:admin,mod # In arrayname:like:%john% # LIKE patterndeleted_at:is_null # IS NULLPaginatedJson Responder
Section titled “PaginatedJson Responder”PaginatedJson automatically serializes the response and adds pagination headers:
// With total countPaginatedJson::new(users, ¶ms, total_count)Response Headers
Section titled “Response Headers”X-Total-Count: 100X-Total-Pages: 5X-Current-Page: 1X-Per-Page: 20Link Header
Section titled “Link Header”Generate RFC 5988 Link headers:
use paginator_axum::create_link_header;
let link = create_link_header(¶ms, total_count, "/api/users");