Skip to content

Commit 65f5c41

Browse files
committed
Request: allow Deserialize<'de> for .query()
Allows us to avoid extra allocations from querystring parsing. Conflicts: src/request.rs
1 parent c49051d commit 65f5c41

File tree

1 file changed

+15
-2
lines changed

1 file changed

+15
-2
lines changed

src/request.rs

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use std::ops::Index;
66
use std::pin::Pin;
77
use std::task::{Context, Poll};
88

9-
use crate::convert::{DeserializeOwned, Serialize};
9+
use crate::convert::{Deserialize, DeserializeOwned, Serialize};
1010
use crate::headers::{
1111
self, HeaderName, HeaderValue, HeaderValues, Headers, Names, ToHeaderValues, Values,
1212
CONTENT_TYPE,
@@ -615,6 +615,8 @@ impl Request {
615615
/// use http_types::Request;
616616
/// use std::collections::HashMap;
617617
///
618+
/// // An owned structure:
619+
///
618620
/// #[derive(Deserialize)]
619621
/// struct Index {
620622
/// page: u32,
@@ -626,8 +628,19 @@ impl Request {
626628
/// assert_eq!(page, 2);
627629
/// assert_eq!(selections["width"], "narrow");
628630
/// assert_eq!(selections["height"], "tall");
631+
///
632+
/// // Using borrows:
633+
///
634+
/// #[derive(Deserialize)]
635+
/// struct Query<'q> {
636+
/// format: &'q str,
637+
/// }
638+
///
639+
/// let mut req = Request::get("https://httpbin.org/get?format=bananna");
640+
/// let Query { format } = req.query().unwrap();
641+
/// assert_eq!(format, "bananna");
629642
/// ```
630-
pub fn query<T: serde::de::DeserializeOwned>(&self) -> crate::Result<T> {
643+
pub fn query<'de, T: Deserialize<'de>>(&'de self) -> crate::Result<T> {
631644
// Default to an empty query string if no query parameter has been specified.
632645
// This allows successful deserialisation of structs where all fields are optional
633646
// when none of those fields has actually been passed by the caller.

0 commit comments

Comments
 (0)