use std::{convert::Infallible, ops::Deref};
use crate::http::Payload;
use crate::web::{AppState, FromRequest, HttpRequest};
#[derive(Debug)]
pub struct State<St>(St);
impl<St> Deref for State<St> {
type Target = St;
fn deref(&self) -> &St {
&self.0
}
}
impl<St: AppState + Clone> FromRequest<St> for State<St> {
type Error = Infallible;
#[inline]
async fn from_request(st: &St, _: &HttpRequest, _: &mut Payload) -> Result<Self, Self::Error> {
Ok(Self(st.clone()))
}
}
#[cfg(test)]
mod tests {
use crate::http::StatusCode;
use crate::web::test::{TestRequest, init_service};
use crate::web::{self, App, HttpResponse, WebError};
use super::*;
#[crate::rt_test]
async fn test_state_extractor() {
#[allow(dead_code)]
#[derive(Clone, Default)]
struct MyState {
val: usize,
}
impl AppState for MyState {
type Error = WebError;
}
let srv = init_service(
App::<MyState>::with()
.service(web::resource("/").to(|_: State<MyState>| async { HttpResponse::Ok() })),
)
.await;
let req = TestRequest::default().to_request();
let resp = srv.call(req).await.unwrap();
assert_eq!(resp.status(), StatusCode::OK);
let srv = init_service(
App::<MyState>::with()
.service(web::resource("/").to(|_: State<MyState>| async { HttpResponse::Ok() })),
)
.await;
let req = TestRequest::default().to_request();
let res = srv.call(req).await.unwrap();
assert_eq!(res.status(), StatusCode::OK);
}
}