Drop Deref and DerefMut on web::Path

@robjtede: Deref impl [with public Path contents] allowed access to tuple elements like path.1 but then path.0.1 also worked so it was weird.
This commit is contained in:
Iria.Somobu 2025-02-27 17:42:09 +03:00
parent 8a3a1f2eec
commit 1e2de3be5d
3 changed files with 12 additions and 16 deletions

View File

@ -24,7 +24,7 @@ mod scope_module {
#[get("/twice-test/{value}")] #[get("/twice-test/{value}")]
pub async fn twice(value: web::Path<String>) -> impl actix_web::Responder { pub async fn twice(value: web::Path<String>) -> impl actix_web::Responder {
let int_value: i32 = value.parse().unwrap_or(0); let int_value: i32 = value.0.parse().unwrap_or(0);
let doubled = int_value * 2; let doubled = int_value * 2;
HttpResponse::Ok().body(format!("Twice value: {}", doubled)) HttpResponse::Ok().body(format!("Twice value: {}", doubled))
} }

View File

@ -173,7 +173,7 @@ impl Route {
/// ///
/// /// extract path info using serde /// /// extract path info using serde
/// async fn index(info: web::Path<Info>) -> String { /// async fn index(info: web::Path<Info>) -> String {
/// format!("Welcome {}!", info.username) /// format!("Welcome {}!", info.0.username)
/// } /// }
/// ///
/// let app = App::new().service( /// let app = App::new().service(
@ -199,7 +199,7 @@ impl Route {
/// query: web::Query<HashMap<String, String>>, /// query: web::Query<HashMap<String, String>>,
/// body: web::Json<Info> /// body: web::Json<Info>
/// ) -> String { /// ) -> String {
/// format!("Welcome {}!", path.username) /// format!("Welcome {}!", path.0.username)
/// } /// }
/// ///
/// let app = App::new().service( /// let app = App::new().service(

View File

@ -4,7 +4,7 @@ use std::sync::Arc;
use actix_router::PathDeserializer; use actix_router::PathDeserializer;
use actix_utils::future::{ready, Ready}; use actix_utils::future::{ready, Ready};
use derive_more::{AsRef, Deref, DerefMut, Display, From}; use derive_more::{AsRef, Display, From};
use serde::de; use serde::de;
use crate::{ use crate::{
@ -50,10 +50,10 @@ use crate::{
/// // extract `Info` from a path using serde /// // extract `Info` from a path using serde
/// #[get("/{name}")] /// #[get("/{name}")]
/// async fn index(info: web::Path<Info>) -> String { /// async fn index(info: web::Path<Info>) -> String {
/// format!("Welcome {}!", info.name) /// format!("Welcome {}!", info.0.name)
/// } /// }
/// ``` /// ```
#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Deref, DerefMut, AsRef, Display, From)] #[derive(Debug, PartialEq, Eq, PartialOrd, Ord, AsRef, Display, From)]
pub struct Path<T>(pub T); pub struct Path<T>(pub T);
impl<T> Path<T> { impl<T> Path<T> {
@ -179,7 +179,7 @@ mod tests {
resource.capture_match_info(req.match_info_mut()); resource.capture_match_info(req.match_info_mut());
let (req, mut pl) = req.into_parts(); let (req, mut pl) = req.into_parts();
assert_eq!(*Path::<i8>::from_request(&req, &mut pl).await.unwrap(), 32); assert_eq!(Path::<i8>::from_request(&req, &mut pl).await.unwrap().0, 32);
assert!(Path::<MyStruct>::from_request(&req, &mut pl).await.is_err()); assert!(Path::<MyStruct>::from_request(&req, &mut pl).await.is_err());
} }
@ -218,17 +218,13 @@ mod tests {
resource.capture_match_info(req.match_info_mut()); resource.capture_match_info(req.match_info_mut());
let (req, mut pl) = req.into_parts(); let (req, mut pl) = req.into_parts();
let mut s = Path::<MyStruct>::from_request(&req, &mut pl).await.unwrap(); let Path(s) = Path::<MyStruct>::from_request(&req, &mut pl).await.unwrap();
assert_eq!(s.key, "name"); assert_eq!(s.key, "name");
assert_eq!(s.value, "user1"); assert_eq!(s.value, "user1");
s.value = "user2".to_string();
assert_eq!(s.value, "user2");
assert_eq!( assert_eq!(
format!("{}, {:?}", s, s), format!("{}, {:?}", s, s),
"MyStruct(name, user2), Path(MyStruct { key: \"name\", value: \"user2\" })" "MyStruct(name, user1), MyStruct { key: \"name\", value: \"user1\" }"
); );
let s = s.into_inner();
assert_eq!(s.value, "user2");
let Path(s) = Path::<(String, String)>::from_request(&req, &mut pl) let Path(s) = Path::<(String, String)>::from_request(&req, &mut pl)
.await .await
@ -243,7 +239,7 @@ mod tests {
let (req, mut pl) = req.into_parts(); let (req, mut pl) = req.into_parts();
let s = Path::<Test2>::from_request(&req, &mut pl).await.unwrap(); let s = Path::<Test2>::from_request(&req, &mut pl).await.unwrap();
assert_eq!(s.as_ref().key, "name"); assert_eq!(s.as_ref().key, "name");
assert_eq!(s.value, 32); assert_eq!(s.0.value, 32);
let Path(s) = Path::<(String, u8)>::from_request(&req, &mut pl) let Path(s) = Path::<(String, u8)>::from_request(&req, &mut pl)
.await .await
@ -251,7 +247,7 @@ mod tests {
assert_eq!(s.0, "name"); assert_eq!(s.0, "name");
assert_eq!(s.1, 32); assert_eq!(s.1, 32);
let res = Path::<Vec<String>>::from_request(&req, &mut pl) let Path(res) = Path::<Vec<String>>::from_request(&req, &mut pl)
.await .await
.unwrap(); .unwrap();
assert_eq!(res[0], "name".to_owned()); assert_eq!(res[0], "name".to_owned());
@ -265,7 +261,7 @@ mod tests {
resource.capture_match_info(req.match_info_mut()); resource.capture_match_info(req.match_info_mut());
let (req, mut pl) = req.into_parts(); let (req, mut pl) = req.into_parts();
let path_items = Path::<MyStruct>::from_request(&req, &mut pl).await.unwrap(); let Path(path_items) = Path::<MyStruct>::from_request(&req, &mut pl).await.unwrap();
assert_eq!(path_items.key, "na+me"); assert_eq!(path_items.key, "na+me");
assert_eq!(path_items.value, "us/er%42"); assert_eq!(path_items.value, "us/er%42");
assert_eq!(req.match_info().as_str(), "/na%2Bme/us%2Fer%2542"); assert_eq!(req.match_info().as_str(), "/na%2Bme/us%2Fer%2542");