From 6d0bc6bd1a633cea0bbb32f2867af39dade6a6cf Mon Sep 17 00:00:00 2001 From: Yuki Okushi Date: Sat, 18 Apr 2026 14:56:20 +0900 Subject: [PATCH] fix for tuple struct --- actix-router/src/de.rs | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/actix-router/src/de.rs b/actix-router/src/de.rs index 99fbadddc..d255704fe 100644 --- a/actix-router/src/de.rs +++ b/actix-router/src/de.rs @@ -435,13 +435,13 @@ impl<'de> Deserializer<'de> for Value<'de> { fn deserialize_tuple_struct( self, _: &'static str, - _: usize, - _: V, + len: usize, + visitor: V, ) -> Result where V: Visitor<'de>, { - Err(de::value::Error::custom("unsupported type: tuple struct")) + self.deserialize_tuple(len, visitor) } fn deserialize_any(self, visitor: V) -> Result @@ -627,6 +627,14 @@ mod tests { tail: (String, String, String), } + #[derive(Debug, Deserialize)] + struct TestSeq3 { + tail: TestTupleStruct, + } + + #[derive(Debug, Deserialize, PartialEq)] + struct TestTupleStruct(String, String, String); + #[test] fn test_request_extract() { let mut router = Router::<()>::build(); @@ -753,6 +761,16 @@ mod tests { String::from("slash/es") ) ); + + let i: TestSeq3 = de::Deserialize::deserialize(PathDeserializer::new(&path)).unwrap(); + assert_eq!( + i.tail, + TestTupleStruct( + String::from("tail"), + String::from("with"), + String::from("slash/es") + ) + ); } #[test]