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.url().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
}
}