Expand description
Shared response types for Axum JSON APIs.
Provides building blocks that every Axum CRUD service needs but always re-defines from scratch:
ApiError- a machine-readable JSON error body withcode,message, and optionaldetails, plus factory helpers that return(StatusCode, Json<ApiError>)tuples ready for use with Axum’sIntoResponse. SupportsFromconversions for common error types. With the optionalvalidatorfeature enabled, also supports convertingvalidator::ValidationErrorsinto structured field errors. With the optionalsqlxfeature enabled, also supports convertingsqlx::Errorinto semantically correct HTTP status codes (404, 409, 422, 503, 500).ListResponse<T>- a generic offset/limit paginated collection response withdata,total,limit, andoffsetfields.CursorResponse<T>- a generic cursor-based paginated collection response for large datasets or feeds, withdata,next_cursor, andhas_morefields.HealthResponse- a health-check response withstatusfield supportingok,degraded, andunhealthystates.
§Quick Start
use axum::{Json, http::StatusCode, response::IntoResponse};
use axum_api_kit::{ApiError, ListResponse, CursorResponse, HealthResponse};
use serde::Serialize;
#[derive(Serialize)]
struct Item { id: String }
async fn list_items() -> impl IntoResponse {
let items = vec![Item { id: "1".into() }];
Json(ListResponse { data: items, total: 1, limit: 50, offset: 0 })
}
async fn feed_items(cursor: Option<String>) -> impl IntoResponse {
let items = vec![Item { id: "1".into() }];
CursorResponse { data: items, next_cursor: Some("abc".into()), has_more: true }
}
async fn get_item() -> impl IntoResponse {
ApiError::not_found("item not found")
}
async fn health() -> impl IntoResponse {
HealthResponse::ok()
}Structs§
- ApiError
- A machine-readable JSON error body.
- Cursor
Response - A cursor-based paginated collection response.
- Health
Response - A minimal health-check response body.
- List
Response - A generic paginated collection response.