diff --git a/src/main.rs b/src/main.rs index 035b4ba..0a21937 100644 --- a/src/main.rs +++ b/src/main.rs @@ -425,8 +425,8 @@ where { use serde::Deserialize; - let opt = Option::<&'de str>::deserialize(de)?; - match opt { + let opt = Option::>::deserialize(de)?; + match opt.as_deref() { None | Some("") => Ok(None), Some(s) => s.parse::().map_err(serde::de::Error::custom).map(Some), } @@ -671,4 +671,48 @@ mod parse_query_params { ) "#); } + + #[test] + fn ipv4_and_empty_ipv6() { + let uri = http::Uri::builder() + .path_and_query("/update?ipv4=1.2.3.4&ipv6=") + .build() + .unwrap(); + let query: Query = Query::try_from_uri(&uri).unwrap(); + insta::assert_debug_snapshot!(query, @r#" + Query( + FritzBoxUpdateParams { + domain: None, + ipv4: Some( + 1.2.3.4, + ), + ipv6: None, + ipv6prefix: None, + dualstack: None, + }, + ) + "#); + } + + #[test] + fn empty_ipv4_and_ipv6() { + let uri = http::Uri::builder() + .path_and_query("/update?ipv4=&ipv6=%3A%3A1234") + .build() + .unwrap(); + let query: Query = Query::try_from_uri(&uri).unwrap(); + insta::assert_debug_snapshot!(query, @r#" + Query( + FritzBoxUpdateParams { + domain: None, + ipv4: None, + ipv6: Some( + ::1234, + ), + ipv6prefix: None, + dualstack: None, + }, + ) + "#); + } }