covert_framework/extract/
json.rs1use std::ops::Deref;
2
3use covert_types::error::ApiError;
4use serde::de::DeserializeOwned;
5use tracing::debug;
6
7use super::{FromRequest, Request};
8
9#[derive(Debug)]
10pub struct Json<T>(pub T);
11
12impl<T> Deref for Json<T> {
13 type Target = T;
14
15 #[inline]
16 fn deref(&self) -> &Self::Target {
17 &self.0
18 }
19}
20
21impl<T: DeserializeOwned> FromRequest for Json<T> {
22 #[tracing::instrument(level = "debug", name = "json_extractor", skip_all)]
23 fn from_request(req: &mut Request) -> Result<Self, ApiError> {
24 serde_json::from_slice(&req.data).map(Json).map_err(|_| {
25 let expected_type_name = std::any::type_name::<T>();
26 debug!(data = ?req.data, expected_type_name, "JSON extraction failed");
27 ApiError::bad_request()
28 })
29 }
30}