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>()
26            .map(State)
27            .ok_or_else(|| {
28                Error::Internal(format!(
29                    "state `{}` is not registered — call app.state(..)",
30                    std::any::type_name::<T>()
31                ))
32            })
33    }
34}
35
36/// Per-request extension (`req.set` / `req.get`).
37#[derive(Debug, Clone)]
38pub struct Extension<T>(pub T);
39
40impl<T> Extension<T> {
41    pub fn into_inner(self) -> T {
42        self.0
43    }
44}
45
46impl<T> std::ops::Deref for Extension<T> {
47    type Target = T;
48    fn deref(&self) -> &Self::Target {
49        &self.0
50    }
51}
52
53impl<T: Clone + Send + Sync + 'static> FromRequestParts for Extension<T> {
54    fn from_request_parts(req: &Request) -> Result<Self> {
55        req.get::<T>()
56            .cloned()
57            .map(Extension)
58            .ok_or_else(|| {
59                Error::BadRequest(format!(
60                    "missing extension `{}`",
61                    std::any::type_name::<T>()
62                ))
63            })
64    }
65}