use crate::Extract;
use crate::Request;
use serde::de::DeserializeOwned;
use std::fmt::{Display, Formatter};
use std::ops::Deref;
pub struct Query<T>(pub T);
impl<T> Extract for Query<T>
where
T: DeserializeOwned,
{
type Error = QueryError;
fn extract<B>(request: &Request<B>) -> Result<Self, Self::Error> {
let query = request.uri().query().unwrap_or_default();
Ok(Query(
serde_urlencoded::from_str(query).map_err(|e| QueryError(e.to_string()))?,
))
}
}
impl<T> Deref for Query<T> {
type Target = T;
fn deref(&self) -> &Self::Target {
&self.0
}
}
pub struct QueryError(pub String);
impl Display for QueryError {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", self.0)
}
}