| Crates.io | facet-axum |
| lib.rs | facet-axum |
| version | 0.43.1 |
| created_at | 2025-12-11 16:57:25.470144+00 |
| updated_at | 2026-01-23 08:52:29.738135+00 |
| description | Axum integration for Facet - extractors and responses using Facet's serialization |
| homepage | https://facet.rs |
| repository | https://github.com/facet-rs/facet |
| max_upload_size | |
| id | 1980133 |
| size | 41,301 |
Axum integration for Facet - extractors and responses using Facet's serialization.
This crate provides Axum extractors and response types that use Facet's serialization instead of serde. This allows you to use Facet-derived types directly in your Axum handlers without needing serde derives.
use axum::{routing::{get, post}, Router};
use facet::Facet;
use facet_axum::{Json, Query};
#[derive(Debug, Facet)]
struct CreateUser {
name: String,
email: String,
}
#[derive(Debug, Facet)]
struct User {
id: u64,
name: String,
email: String,
}
#[derive(Debug, Facet)]
struct SearchParams {
q: String,
page: u64,
}
async fn create_user(Json(payload): Json<CreateUser>) -> Json<User> {
Json(User {
id: 1,
name: payload.name,
email: payload.email,
})
}
async fn search(Query(params): Query<SearchParams>) -> String {
format!("Searching for '{}' on page {}", params.q, params.page)
}
let app = Router::new()
.route("/users", post(create_user))
.route("/search", get(search));
json (default): Enables Json<T> extractor/response using facet-jsonform (default): Enables Form<T> and Query<T> extractors using facet-urlencodedyaml: Enables Yaml<T> extractor/response using facet-yamltoml: Enables Toml<T> extractor/response using facet-tomlxml: Enables Xml<T> extractor/response using facet-xmlmsgpack: Enables MsgPack<T> extractor/response using facet-msgpackpostcard: Enables Postcard<T> extractor/response using facet-postcardall: Enables all format featuresThanks to all individual sponsors:
...along with corporate sponsors:
...without whom this work could not exist.
The facet logo was drawn by Misiasart.
Licensed under either of:
at your option.