diff --git a/Cargo.toml b/Cargo.toml index d7f9b78..82c2e83 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "axum-valid" -version = "0.4.1" +version = "0.4.2" description = "Validation tools for axum using the validator library." authors = ["GengTeng "] license = "MIT" @@ -23,11 +23,6 @@ edition = "2021" axum = { version = "0.6.18", default-features = false } validator = "0.16.0" -[dependencies.serde_json] -package = "serde_json" -version = "1.0.103" -optional = true - [dev-dependencies] anyhow = "1.0.71" axum = { version = "0.6.18" } @@ -37,11 +32,12 @@ reqwest = { version = "0.11.18", features = ["json"] } serde = { version = "1.0.163", features = ["derive"] } validator = { version = "0.16.0", features = ["derive"] } serde_json = "1.0.103" +mime = "0.3.17" [features] default = ["json", "form", "query"] json = ["axum/json"] form = ["axum/form"] query = ["axum/query"] -into_json = ["serde_json"] +into_json = ["json"] 422 = [] diff --git a/src/lib.rs b/src/lib.rs index f273af8..cce4e61 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -47,16 +47,14 @@ impl IntoResponse for ValidRejection { match self { ValidRejection::Valid(validate_error) => { #[cfg(feature = "into_json")] - match serde_json::to_string(&validate_error) { - Ok(json) => (VALIDATION_ERROR_STATUS, json), - Err(error) => ( - StatusCode::INTERNAL_SERVER_ERROR, - format!("Failed to serialize validation error into JSON ({validate_error}): {error}"), - ), + { + (VALIDATION_ERROR_STATUS, axum::Json(validate_error)).into_response() } #[cfg(not(feature = "into_json"))] - (VALIDATION_ERROR_STATUS, validate_error.to_string()) - }.into_response(), + { + (VALIDATION_ERROR_STATUS, validate_error.to_string()).into_response() + } + } ValidRejection::Inner(json_error) => json_error.into_response(), } } diff --git a/tests/basic.rs b/tests/basic.rs index b967b53..72a5469 100644 --- a/tests/basic.rs +++ b/tests/basic.rs @@ -15,6 +15,8 @@ use serde_json::json; use std::net::SocketAddr; use validator::Validate; +mod utils; + mod route { pub const PATH: &str = "/path/:v0/:v1"; pub const QUERY: &str = "/query"; @@ -78,10 +80,7 @@ async fn main() -> anyhow::Result<()> { .await?; assert_eq!(invalid_path_response.status(), VALIDATION_ERROR_STATUS); #[cfg(feature = "into_json")] - assert!(invalid_path_response - .json::() - .await - .is_ok()); + utils::check_json(invalid_path_response).await; println!("Valid> works."); // Valid> @@ -107,10 +106,7 @@ async fn main() -> anyhow::Result<()> { .await?; assert_eq!(invalid_query_response.status(), VALIDATION_ERROR_STATUS); #[cfg(feature = "into_json")] - assert!(invalid_query_response - .json::() - .await - .is_ok()); + utils::check_json(invalid_query_response).await; println!("Valid> works."); // Valid> @@ -139,10 +135,7 @@ async fn main() -> anyhow::Result<()> { .await?; assert_eq!(invalid_form_response.status(), VALIDATION_ERROR_STATUS); #[cfg(feature = "into_json")] - assert!(invalid_form_response - .json::() - .await - .is_ok()); + utils::check_json(invalid_form_response).await; println!("Valid> works."); // Valid> @@ -171,10 +164,7 @@ async fn main() -> anyhow::Result<()> { .await?; assert_eq!(invalid_json_response.status(), VALIDATION_ERROR_STATUS); #[cfg(feature = "into_json")] - assert!(invalid_json_response - .json::() - .await - .is_ok()); + utils::check_json(invalid_json_response).await; println!("Valid> works."); drop(server_guard); diff --git a/tests/custom.rs b/tests/custom.rs index bd6ecdd..f3eca8b 100644 --- a/tests/custom.rs +++ b/tests/custom.rs @@ -12,6 +12,8 @@ use serde::{Deserialize, Serialize}; use std::net::SocketAddr; use validator::Validate; +mod utils; + const MY_DATA_HEADER: &str = "My-Data"; // 1. Implement your own extractor. @@ -124,10 +126,7 @@ async fn main() -> anyhow::Result<()> { .await?; assert_eq!(invalid_my_data_response.status(), VALIDATION_ERROR_STATUS); #[cfg(feature = "into_json")] - assert!(invalid_my_data_response - .json::() - .await - .is_ok()); + utils::check_json(invalid_my_data_response).await; println!("Valid works."); drop(server_guard); diff --git a/tests/utils.rs b/tests/utils.rs new file mode 100644 index 0000000..66cc557 --- /dev/null +++ b/tests/utils.rs @@ -0,0 +1,9 @@ +/// Check if the response is a json response +#[cfg(feature = "into_json")] +pub async fn check_json(response: reqwest::Response) { + assert_eq!( + response.headers()[axum::http::header::CONTENT_TYPE], + axum::http::HeaderValue::from_static(mime::APPLICATION_JSON.as_ref()) + ); + assert!(response.json::().await.is_ok()); +}