sova_core/extract/
state.rs1use super::FromRequestParts;
2use crate::error::{Error, Result};
3use crate::request::Request;
4use std::sync::Arc;
5
6#[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#[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}