add support for TypedMultipart
This commit is contained in:
@@ -16,6 +16,8 @@ pub mod query;
|
||||
pub mod test;
|
||||
#[cfg(feature = "typed_header")]
|
||||
pub mod typed_header;
|
||||
#[cfg(feature = "typed_multipart")]
|
||||
pub mod typed_multipart;
|
||||
#[cfg(feature = "yaml")]
|
||||
pub mod yaml;
|
||||
|
||||
|
||||
47
src/test.rs
47
src/test.rs
@@ -14,6 +14,10 @@ use validator::Validate;
|
||||
|
||||
#[derive(Clone, Deserialize, Serialize, Validate, Eq, PartialEq)]
|
||||
#[cfg_attr(feature = "extra_protobuf", derive(prost::Message))]
|
||||
#[cfg_attr(
|
||||
feature = "typed_multipart",
|
||||
derive(axum_typed_multipart::TryFromMultipart)
|
||||
)]
|
||||
pub struct Parameters {
|
||||
#[validate(range(min = 5, max = 10))]
|
||||
#[cfg_attr(feature = "extra_protobuf", prost(int32, tag = "1"))]
|
||||
@@ -69,6 +73,12 @@ async fn test_main() -> anyhow::Result<()> {
|
||||
post(typed_header::extract_typed_header),
|
||||
);
|
||||
|
||||
#[cfg(feature = "typed_multipart")]
|
||||
let router = router.route(
|
||||
typed_multipart::route::TYPED_MULTIPART,
|
||||
post(typed_multipart::extract_typed_header),
|
||||
);
|
||||
|
||||
#[cfg(feature = "extra")]
|
||||
let router = router
|
||||
.route(extra::route::CACHED, post(extra::extract_cached))
|
||||
@@ -191,6 +201,17 @@ async fn test_main() -> anyhow::Result<()> {
|
||||
.await?;
|
||||
}
|
||||
|
||||
#[cfg(feature = "typed_multipart")]
|
||||
{
|
||||
use axum_typed_multipart::TypedMultipart;
|
||||
test_executor
|
||||
.execute::<TypedMultipart<Parameters>>(
|
||||
Method::POST,
|
||||
typed_multipart::route::TYPED_MULTIPART,
|
||||
)
|
||||
.await?;
|
||||
}
|
||||
|
||||
#[cfg(feature = "extra")]
|
||||
{
|
||||
use axum_extra::extract::{Cached, WithRejection};
|
||||
@@ -443,6 +464,32 @@ mod typed_header {
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "typed_multipart")]
|
||||
mod typed_multipart {
|
||||
use crate::test::{validate_again, Parameters};
|
||||
use crate::Valid;
|
||||
use axum::http::StatusCode;
|
||||
use axum_typed_multipart::TypedMultipart;
|
||||
|
||||
pub mod route {
|
||||
pub const TYPED_MULTIPART: &str = "/typed_multipart";
|
||||
}
|
||||
|
||||
impl From<&Parameters> for reqwest::multipart::Form {
|
||||
fn from(value: &Parameters) -> Self {
|
||||
reqwest::multipart::Form::new()
|
||||
.text("v0", value.v0.to_string())
|
||||
.text("v1", value.v1.clone())
|
||||
}
|
||||
}
|
||||
|
||||
pub(super) async fn extract_typed_header(
|
||||
Valid(TypedMultipart(parameters)): Valid<TypedMultipart<Parameters>>,
|
||||
) -> StatusCode {
|
||||
validate_again(parameters)
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "extra")]
|
||||
mod extra {
|
||||
use crate::test::{validate_again, Parameters};
|
||||
|
||||
41
src/typed_multipart.rs
Normal file
41
src/typed_multipart.rs
Normal file
@@ -0,0 +1,41 @@
|
||||
//! # Implementation of the `HasValidate` trait for the `TypedMultipart` extractor.
|
||||
//!
|
||||
|
||||
use crate::HasValidate;
|
||||
use axum_typed_multipart::TypedMultipart;
|
||||
use validator::Validate;
|
||||
|
||||
impl<T: Validate> HasValidate for TypedMultipart<T> {
|
||||
type Validate = T;
|
||||
fn get_validate(&self) -> &T {
|
||||
&self.0
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use crate::tests::{ValidTest, ValidTestParameter};
|
||||
use axum::http::StatusCode;
|
||||
use axum_typed_multipart::TypedMultipart;
|
||||
use reqwest::multipart::Form;
|
||||
use reqwest::RequestBuilder;
|
||||
|
||||
impl<T: ValidTestParameter> ValidTest for TypedMultipart<T>
|
||||
where
|
||||
Form: From<&'static T>,
|
||||
{
|
||||
const ERROR_STATUS_CODE: StatusCode = StatusCode::BAD_REQUEST;
|
||||
|
||||
fn set_valid_request(builder: RequestBuilder) -> RequestBuilder {
|
||||
builder.multipart(Form::from(T::valid()))
|
||||
}
|
||||
|
||||
fn set_error_request(builder: RequestBuilder) -> RequestBuilder {
|
||||
builder.multipart(Form::new())
|
||||
}
|
||||
|
||||
fn set_invalid_request(builder: RequestBuilder) -> RequestBuilder {
|
||||
builder.multipart(Form::from(T::invalid()))
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user