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>()
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#[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}