1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
//! Axum integration for Facet.
//!
//! 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.
//!
//! # Features
//!
//! - `json` (default): Enables `Json<T>` extractor/response using `facet-json`
//! - `form` (default): Enables `Form<T>` and `Query<T>` extractors using `facet-urlencoded`
//!
//! # Example
//!
//! ```ignore
//! 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));
//! ```
// Re-export JSON types
pub use ;
// Re-export form/query types
pub use ;
// Re-export YAML types
pub use ;
// Re-export TOML types
pub use ;
// Re-export XML types
pub use ;
// Re-export MessagePack types
pub use ;
// Re-export Postcard types
pub use ;