request_pretreat/prefabs/
path.rs1use std::{
2 fmt::{Debug, Display},
3 marker::PhantomData,
4};
5
6use actix_web::FromRequest;
7
8use crate::Treater;
9
10use super::RawError;
11
12pub struct PathValue<T: for<'de> serde::Deserialize<'de>>(PhantomData<T>);
13
14impl<T> Treater for PathValue<T>
15where
16 T: for<'de> serde::Deserialize<'de>,
17{
18 type Fut = futures_util::future::Ready<Result<Self::Resp, Self::Err>>;
19
20 type Resp = T;
21
22 type Err = PathError;
23
24 fn proc(req: &actix_web::HttpRequest, payload: &mut actix_web::dev::Payload) -> Self::Fut {
25 let task = actix_web::web::Path::<T>::from_request(req, payload)
26 .into_inner()
27 .map(actix_web::web::Path::into_inner)
28 .map_err(|err| PathError(RawError::new(err)));
29 futures_util::future::ready(task)
30 }
31}
32
33pub struct PathError(RawError<actix_web::error::PathError>);
34
35impl Debug for PathError {
36 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
37 Debug::fmt(&self.0, f)
38 }
39}
40
41impl Display for PathError {
42 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
43 Display::fmt(&self.0, f)
44 }
45}
46
47impl std::error::Error for PathError{}