Module axum_valid::typed_header
source · Expand description
§Support for TypedHeader<T>
§Feature
Enable the typed_header
feature to use Valid<TypedHeader<T>>
.
§Usage
- Implement
Header
andValidate
for your data typeT
. - In your handler function, use
Valid<TypedHeader<T>>
as some parameter’s type.
§Example
#[cfg(feature = "validator")]
mod validator_example {
use axum_extra::headers::{Error, Header, HeaderValue};
use axum_extra::typed_header::TypedHeader;
use axum::http::HeaderName;
use axum::routing::post;
use axum::Router;
use axum_valid::Valid;
use validator::Validate;
pub fn router() -> Router {
Router::new().route("/typed_header", post(handler))
}
async fn handler(Valid(TypedHeader(parameter)): Valid<TypedHeader<Parameter>>) {
assert!(parameter.validate().is_ok());
}
#[derive(Validate)]
pub struct Parameter {
#[validate(range(min = 5, max = 10))]
pub v0: i32,
#[validate(length(min = 1, max = 10))]
pub v1: String,
}
static HEADER_NAME: HeaderName = HeaderName::from_static("my-header");
impl Header for Parameter {
fn name() -> &'static HeaderName {
&HEADER_NAME
}
fn decode<'i, I>(_values: &mut I) -> Result<Self, Error>
where
Self: Sized,
I: Iterator<Item = &'i HeaderValue>,
{
todo!()
}
fn encode<E: Extend<HeaderValue>>(&self, _values: &mut E) {
todo!()
}
}
}
#[cfg(feature = "garde")]
mod garde_example {
use axum_extra::headers::{Error, Header, HeaderValue};
use axum_extra::typed_header::TypedHeader;
use axum::http::HeaderName;
use axum::routing::post;
use axum::Router;
use axum_valid::Garde;
use garde::Validate;
pub fn router() -> Router {
Router::new().route("/typed_header", post(handler))
}
async fn handler(Garde(TypedHeader(parameter)): Garde<TypedHeader<Parameter>>) {
assert!(parameter.validate(&()).is_ok());
}
#[derive(Validate)]
pub struct Parameter {
#[garde(range(min = 5, max = 10))]
pub v0: i32,
#[garde(length(min = 1, max = 10))]
pub v1: String,
}
static HEADER_NAME: HeaderName = HeaderName::from_static("my-header");
impl Header for Parameter {
fn name() -> &'static HeaderName {
&HEADER_NAME
}
fn decode<'i, I>(_values: &mut I) -> Result<Self, Error>
where
Self: Sized,
I: Iterator<Item = &'i HeaderValue>,
{
todo!()
}
fn encode<E: Extend<HeaderValue>>(&self, _values: &mut E) {
todo!()
}
}
}