channel_server/request/
param.rs

1use std::ops::{Deref, DerefMut};
2
3use serde::de::DeserializeOwned;
4
5use crate::{Body, ChannelError, FromRequest, Request};
6
7#[derive(Debug, Clone, Eq, PartialEq, Default)]
8pub struct ReqParam<T>(pub T);
9
10impl<T> Deref for ReqParam<T> {
11    type Target = T;
12
13    fn deref(&self) -> &Self::Target {
14        &self.0
15    }
16}
17
18impl<T> DerefMut for ReqParam<T> {
19    fn deref_mut(&mut self) -> &mut Self::Target {
20        &mut self.0
21    }
22}
23
24impl<'a, T: DeserializeOwned> FromRequest<'a> for ReqParam<T> {
25    fn from_request(req: &'a Request, _body: &mut Body) -> Result<Self, ChannelError> {
26        let param = req.param().as_ref()?;
27        Ok(Self(
28            serde_json::from_slice(param.as_bytes()).map_err(|_e| ChannelError::ParseJsonError)?,
29        ))
30    }
31}