Crates.io | axum-codec |
lib.rs | axum-codec |
version | 0.0.14 |
source | src |
created_at | 2024-07-09 20:05:03.612995 |
updated_at | 2024-10-06 21:29:10.109561 |
description | A multi-codec extractor and response writer for Axum |
homepage | |
repository | https://github.com/matteopolak/axum-codec |
max_upload_size | |
id | 1297430 |
size | 72,729 |
A body extractor for the Axum web framework.
axum::routing::method_routing
to automatically encode responses in the correct format according to the specified Accept
header (with a fallback to Content-Type
, then one of the enabled formats).macros
feature) to add derives for all enabled formats to a struct/enum.bitcode
, bincode
, ciborium
, rmp
, toml
, serde_yaml
, and serde_json
MethodRouter
to automatically encode responses in the correct formataide
validator
Here's a quick example that can do the following:
User
from the request body in any of the supported formats.Greeting
to the response body in any of the supported formats.use axum::{Router, response::IntoResponse};
use axum_codec::{
response::IntoCodecResponse,
routing::{get, post},
Codec, Accept,
};
// Shorthand for the following (assuming all features are enabled):
//
// #[derive(
// serde::Serialize, serde::Deserialize,
// bincode::Encode, bincode::Decode,
// bitcode::Encode, bitcode::Decode,
// validator::Validate,
// )]
// #[serde(crate = "...")]
// #[bincode(crate = "...")]
// #[bitcode(crate = "...")]
// #[validator(crate = "...")]
#[axum_codec::apply(encode, decode)]
struct User {
name: String,
age: u8,
}
async fn me() -> Codec<User> {
Codec(User {
name: "Alice".into(),
age: 42,
})
}
/// A manual implementation of the handler above.
async fn manual_me(accept: Accept) -> impl IntoResponse {
Codec(User {
name: "Alice".into(),
age: 42,
})
.into_codec_response(accept.into())
}
#[axum_codec::apply(encode)]
struct Greeting {
message: String,
}
/// Specify `impl IntoCodecResponse`, similar to `axum`
async fn greet(Codec(user): Codec<User>) -> impl IntoCodecResponse {
Codec(Greeting {
message: format!("Hello, {}! You are {} years old.", user.name, user.age),
})
}
#[tokio::main]
async fn main() {
let app: Router = Router::new()
.route("/me", get(me).into())
.route("/manual", axum::routing::get(manual_me))
.route("/greet", post(greet).into());
let listener = tokio::net::TcpListener::bind(("127.0.0.1", 3000))
.await
.unwrap();
// axum::serve(listener, app).await.unwrap();
}
macros
: Enables the axum_codec::apply
attribute macro.json
*: Enables JSON
support.msgpack
: Enables MessagePack
support.bincode
: Enables Bincode
support.bitcode
: Enables Bitcode
support.cbor
: Enables CBOR
support.yaml
: Enables YAML
support.toml
: Enables TOML
support.aide
: Enables support for the Aide
documentation library.validator
: Enables support for the Validator
validation library, validating all input when extracted with Codec<T>
.* Enabled by default.
#[axum::debug_handler]
Since axum-codec
uses its own IntoCodecResponse
trait for encoding responses, it is not compatible with #[axum::debug_handler]
. However, a new #[axum_codec::debug_handler]
(and #[axum_codec::debug_middleware]
) macro
is provided as a drop-in replacement.
Dual-licensed under MIT or Apache License v2.0.