use cookie::CookieJar;
use delegate::delegate;
use http::{Extensions, HeaderMap, Method, Uri, Version};
use hyper::upgrade::OnUpgrade;
use std::sync::Arc;
use crate::app::Shared;
use crate::error::Error;
use crate::request::params::PathParam;
use crate::request::{Envelope, PathParams, QueryParams};
#[derive(Debug)]
pub struct Request<App = ()> {
pub(super) on_upgrade: Option<OnUpgrade>,
envelope: Arc<Envelope>,
app: Shared<App>,
}
impl<App> Request<App> {
pub fn app(&self) -> &App {
&self.app
}
pub fn app_owned(&self) -> Shared<App> {
self.app.clone()
}
delegate! {
to self.envelope {
pub fn method(&self) -> &Method;
pub fn uri(&self) -> &Uri;
pub fn version(&self) -> Version;
pub fn headers(&self) -> &HeaderMap;
pub fn cookies(&self) -> &CookieJar;
pub fn extensions(&self) -> &Extensions;
pub fn param<'b>(&self, name: &'b str) -> PathParam<'_, 'b>;
pub fn query<'a, T>(&'a self) -> crate::Result<T>
where
T: TryFrom<QueryParams<'a>, Error = Error>;
pub fn params<'a, T>(&'a self) -> crate::Result<T>
where
T: TryFrom<PathParams<'a>>,
Error: From<T::Error>;
}
}
}
impl<App> Request<App> {
pub(super) fn new(request: crate::Request<App>) -> Self {
let (mut envelope, _, app) = request.into_parts();
Self {
on_upgrade: envelope.extensions_mut().remove(),
envelope: Arc::new(envelope),
app,
}
}
}
impl<App> Clone for Request<App> {
fn clone(&self) -> Self {
Self {
on_upgrade: None,
envelope: Arc::clone(&self.envelope),
app: self.app.clone(),
}
}
}