Add web::ReqData

This commit is contained in:
Jonas Platte 2020-10-09 14:05:20 +02:00 committed by Rob Ede
parent cb60d026c7
commit e39775f791
No known key found for this signature in database
GPG Key ID: C2A3B36E841A91E6
3 changed files with 53 additions and 0 deletions

View File

@ -81,6 +81,7 @@ mod handler;
mod info;
pub mod middleware;
mod request;
mod request_data;
mod resource;
mod responder;
mod rmap;

51
src/request_data.rs Normal file
View File

@ -0,0 +1,51 @@
use std::ops::{Deref, DerefMut};
use actix_http::error::{Error, ErrorInternalServerError};
use futures_util::future;
use crate::{dev::Payload, FromRequest, HttpRequest};
/// Request data.
///
/// Request data is a piece of arbitrary data attached to a request.
///
/// It can be set via [`HttpMessage::extensions_mut`].
///
/// [`HttpMessage::extensions_mut`]: crate::HttpMessage::extensions_mut
#[derive(Clone, Debug)]
pub struct ReqData<T: Clone + 'static>(pub T);
impl<T: Clone + 'static> Deref for ReqData<T> {
type Target = T;
fn deref(&self) -> &T {
&self.0
}
}
impl<T: Clone + 'static> DerefMut for ReqData<T> {
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.0
}
}
impl<T: Clone + 'static> FromRequest for ReqData<T> {
type Config = ();
type Error = Error;
type Future = future::Ready<Result<Self, Error>>;
fn from_request(req: &HttpRequest, _: &mut Payload) -> Self::Future {
if let Some(st) = req.extensions().get::<T>() {
future::ok(ReqData(st.clone()))
} else {
log::debug!(
"Failed to construct App-level ReqData extractor. \
Request path: {:?}",
req.path()
);
future::err(ErrorInternalServerError(
"Missing expected request extension data",
))
}
}
}

View File

@ -19,6 +19,7 @@ use crate::service::WebService;
pub use crate::config::ServiceConfig;
pub use crate::data::Data;
pub use crate::request::HttpRequest;
pub use crate::request_data::ReqData;
pub use crate::types::*;
/// Create resource for a specific path.