Skip to main content

sova_core/extract/
json.rs

1use super::{ExtractFuture, FromRequest};
2use crate::error::Result;
3use crate::request::Request;
4use serde::de::DeserializeOwned;
5
6/// JSON body deserialized into `T`.
7///
8/// Distinct from [`crate::Json`] (response wrapper) — import as `sova_core::extract::Json`.
9#[derive(Debug, Clone)]
10pub struct Json<T>(pub T);
11
12impl<T> Json<T> {
13    pub fn into_inner(self) -> T {
14        self.0
15    }
16}
17
18impl<T> std::ops::Deref for Json<T> {
19    type Target = T;
20    fn deref(&self) -> &Self::Target {
21        &self.0
22    }
23}
24
25impl<T: DeserializeOwned + Send + 'static> FromRequest for Json<T> {
26    fn from_request(req: &mut Request) -> ExtractFuture<'_, Result<Self>> {
27        Box::pin(async move {
28            let value: T = req.json().await?;
29            Ok(Json(value))
30        })
31    }
32}