1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
use crate::{Error, Additional, Extractor, http::Request};
use serde::de::DeserializeOwned;
use std::sync::Arc;
use std::ops::{Deref, DerefMut};
pub struct Query<Q>(pub Q);
impl<Q> Query<Q> {
pub fn into_inner(self) -> Q {
self.0
}
}
impl<T: Sync, Q: 'static + DeserializeOwned + Send> Extractor<T> for Query<Q> {
fn extract(req: &Request, _additional: Arc<Additional<T>>) -> Result<Self, Error> {
if let Some(query) = req.query() {
serde_qs::from_str::<Q>(query)
} else {
serde_qs::from_str::<Q>("")
}.map(|q| Query(q)).map_err(|e| Error::ExtractionBR(format!("query deserialization failure, {}", e)))
}
}
impl<Q> Deref for Query<Q> {
type Target = Q;
fn deref(&self) -> &Self::Target {
&self.0
}
}
impl<Q> DerefMut for Query<Q> {
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.0
}
}