Skip to main content

sova_core/extract/
state.rs

1use super::FromRequestParts;
2use crate::error::{Error, Result};
3use crate::request::Request;
4use std::sync::Arc;
5
6/// Shared app state registered via `app.state(T)`.
7#[derive(Debug, Clone)]
8pub struct State<T>(pub Arc<T>);
9
10impl<T> State<T> {
11    pub fn into_inner(self) -> Arc<T> {
12        self.0
13    }
14}
15
16impl<T> std::ops::Deref for State<T> {
17    type Target = T;
18    fn deref(&self) -> &Self::Target {
19        &self.0
20    }
21}
22
23impl<T: Send + Sync + 'static> FromRequestParts for State<T> {
24    fn from_request_parts(req: &Request) -> Result<Self> {
25        req.try_state::<T>().map(State).ok_or_else(|| {
26            Error::Internal(format!(
27                "state `{}` is not registered — call app.state(..)",
28                std::any::type_name::<T>()
29            ))
30        })
31    }
32}
33
34/// Per-request extension (`req.set` / `req.get`).
35#[derive(Debug, Clone)]
36pub struct Extension<T>(pub T);
37
38impl<T> Extension<T> {
39    pub fn into_inner(self) -> T {
40        self.0
41    }
42}
43
44impl<T> std::ops::Deref for Extension<T> {
45    type Target = T;
46    fn deref(&self) -> &Self::Target {
47        &self.0
48    }
49}
50
51impl<T: Clone + Send + Sync + 'static> FromRequestParts for Extension<T> {
52    fn from_request_parts(req: &Request) -> Result<Self> {
53        req.get::<T>().cloned().map(Extension).ok_or_else(|| {
54            Error::BadRequest(format!(
55                "missing extension `{}`",
56                std::any::type_name::<T>()
57            ))
58        })
59    }
60}