diff --git a/axum-extra/CHANGELOG.md b/axum-extra/CHANGELOG.md index 37d81f0b..ec02bd28 100644 --- a/axum-extra/CHANGELOG.md +++ b/axum-extra/CHANGELOG.md @@ -7,7 +7,9 @@ and this project adheres to [Semantic Versioning]. # Unreleased -- None. +- **added:** Add `extract::Query` which supports multi-value items ([#1041]) + +[#1041]: https://github.com/tokio-rs/axum/pull/1041 # 0.3.2 (15. May, 2022) diff --git a/axum-extra/Cargo.toml b/axum-extra/Cargo.toml index 3e9807d1..36df3126 100644 --- a/axum-extra/Cargo.toml +++ b/axum-extra/Cargo.toml @@ -18,6 +18,7 @@ cookie = ["cookie-lib"] cookie-signed = ["cookie", "cookie-lib/signed"] cookie-private = ["cookie", "cookie-lib/private"] form = ["serde", "serde_html_form"] +query = ["serde", "serde_html_form"] spa = ["tower-http/fs"] [dependencies] diff --git a/axum-extra/src/extract/mod.rs b/axum-extra/src/extract/mod.rs index 4a98c716..9abed09f 100644 --- a/axum-extra/src/extract/mod.rs +++ b/axum-extra/src/extract/mod.rs @@ -8,6 +8,9 @@ mod form; #[cfg(feature = "cookie")] pub mod cookie; +#[cfg(feature = "query")] +mod query; + pub use self::cached::Cached; #[cfg(feature = "cookie")] @@ -21,3 +24,6 @@ pub use self::cookie::SignedCookieJar; #[cfg(feature = "form")] pub use self::form::Form; + +#[cfg(feature = "query")] +pub use self::query::Query; diff --git a/axum-extra/src/extract/query.rs b/axum-extra/src/extract/query.rs new file mode 100644 index 00000000..dcbcdb31 --- /dev/null +++ b/axum-extra/src/extract/query.rs @@ -0,0 +1,117 @@ +use axum::{ + async_trait, + extract::{ + rejection::{FailedToDeserializeQueryString, QueryRejection}, + FromRequest, RequestParts, + }, +}; +use serde::de::DeserializeOwned; +use std::ops::Deref; + +/// Extractor that deserializes query strings into some type. +/// +/// `T` is expected to implement [`serde::Deserialize`]. +/// +/// # Differences from `axum::extract::Form` +/// +/// This extractor uses [`serde_html_form`] under-the-hood which supports multi-value items. These +/// are sent by multiple `` attributes of the same name (e.g. checkboxes) and `