Module axum_valid::typed_header

source ·
Expand description

§Support for TypedHeader<T>

§Feature

Enable the typed_header feature to use Valid<TypedHeader<T>>.

§Usage

  1. Implement Header and Validate for your data type T.
  2. 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!()
        }
    }
}