Module axum_valid::typed_multipart

source ·
Expand description

§Support for TypedMultipart<T> and BaseMultipart<T, R> from axum_typed_multipart

§Feature

Enable the typed_multipart feature to use Valid<TypedMultipart<T>> and Valid<BaseMultipart<T, R>>.

§Usage

  1. Implement TryFromMultipart and Validate for your data type T.
  2. In your handler function, use Valid<TypedMultipart<T>> or Valid<BaseMultipart<T, E> as some parameter’s type.

§Example

#[cfg(feature = "validator")]
mod validator_example {
    use axum::routing::post;
    use axum::Router;
    use axum_typed_multipart::{BaseMultipart, TryFromMultipart, TypedMultipart, TypedMultipartError};
    use axum_valid::Valid;
    use validator::Validate;

    pub fn router() -> Router {
       Router::new()
            .route("/typed_multipart", post(handler))
            .route("/base_multipart", post(base_handler))
    }

    async fn handler(Valid(TypedMultipart(parameter)): Valid<TypedMultipart<Parameter>>) {
        assert!(parameter.validate().is_ok());
        // Support automatic dereferencing
        println!("v0 = {}, v1 = {}", parameter.v0, parameter.v1);
    }

    async fn base_handler(
        Valid(BaseMultipart {
            data: parameter, ..
        }): Valid<BaseMultipart<Parameter, TypedMultipartError>>,
    ) {
        assert!(parameter.validate().is_ok());
    }

    #[derive(TryFromMultipart, Validate)]
    struct Parameter {
        #[validate(range(min = 5, max = 10))]
        v0: i32,
        #[validate(length(min = 1, max = 10))]
        v1: String,
    }
}

#[cfg(feature = "garde")]
mod garde_example {
    use axum::routing::post;
    use axum::Router;
    use axum_typed_multipart::{BaseMultipart, TryFromMultipart, TypedMultipart, TypedMultipartError};
    use axum_valid::Garde;
    use serde::Deserialize;
    use garde::Validate;

    pub fn router() -> Router {
       Router::new()
            .route("/typed_multipart", post(handler))
            .route("/base_multipart", post(base_handler))
    }

    async fn handler(Garde(TypedMultipart(parameter)): Garde<TypedMultipart<Parameter>>) {
        assert!(parameter.validate(&()).is_ok());
        // Support automatic dereferencing
        println!("v0 = {}, v1 = {}", parameter.v0, parameter.v1);
    }

    async fn base_handler(
        Garde(BaseMultipart {
            data: parameter, ..
        }): Garde<BaseMultipart<Parameter, TypedMultipartError>>,
    ) {
        assert!(parameter.validate(&()).is_ok());
    }

    #[derive(TryFromMultipart, Validate)]
    pub struct Parameter {
        #[garde(range(min = 5, max = 10))]
        pub v0: i32,
        #[garde(length(min = 1, max = 10))]
        pub v1: String,
    }
}