Skip to content

Commit

Permalink
deserialize as Cow instead of &str in pseudo-borrow deserialize
Browse files Browse the repository at this point in the history
seems some backends such as json can fail
on runtime otherwise in certain edge cases
  • Loading branch information
GlenDC committed Jan 9, 2025
1 parent 1a6e00d commit d3391b1
Show file tree
Hide file tree
Showing 14 changed files with 31 additions and 14 deletions.
1 change: 1 addition & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions rama-http-types/src/proto/h1/headers/name.rs
Original file line number Diff line number Diff line change
Expand Up @@ -47,8 +47,8 @@ impl<'de> Deserialize<'de> for Http1HeaderName {
where
D: serde::Deserializer<'de>,
{
let s = <&'de str>::deserialize(deserializer)?;
Self::try_copy_from_str(s).map_err(D::Error::custom)
let s = <std::borrow::Cow<'de, str>>::deserialize(deserializer)?;
Self::try_copy_from_str(&s).map_err(D::Error::custom)
}
}

Expand Down
2 changes: 1 addition & 1 deletion rama-http-types/src/proto/h2/pseudo_header.rs
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ impl<'de> Deserialize<'de> for PseudoHeader {
where
D: serde::Deserializer<'de>,
{
let s = <&'de str>::deserialize(deserializer)?;
let s = <std::borrow::Cow<'de, str>>::deserialize(deserializer)?;
s.parse().map_err(D::Error::custom)
}
}
Expand Down
2 changes: 1 addition & 1 deletion rama-net/src/address/authority.rs
Original file line number Diff line number Diff line change
Expand Up @@ -216,7 +216,7 @@ impl<'de> serde::Deserialize<'de> for Authority {
where
D: serde::Deserializer<'de>,
{
let s = <&'de str>::deserialize(deserializer)?;
let s = <std::borrow::Cow<'de, str>>::deserialize(deserializer)?;
s.parse().map_err(serde::de::Error::custom)
}
}
Expand Down
2 changes: 1 addition & 1 deletion rama-net/src/address/domain.rs
Original file line number Diff line number Diff line change
Expand Up @@ -305,7 +305,7 @@ impl<'de> serde::Deserialize<'de> for Domain {
where
D: serde::Deserializer<'de>,
{
let s = <&'de str>::deserialize(deserializer)?;
let s = <std::borrow::Cow<'de, str>>::deserialize(deserializer)?;
s.parse().map_err(serde::de::Error::custom)
}
}
Expand Down
2 changes: 1 addition & 1 deletion rama-net/src/address/domain_address.rs
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ impl<'de> serde::Deserialize<'de> for DomainAddress {
where
D: serde::Deserializer<'de>,
{
let s = <&'de str>::deserialize(deserializer)?;
let s = <std::borrow::Cow<'de, str>>::deserialize(deserializer)?;
s.parse().map_err(serde::de::Error::custom)
}
}
Expand Down
2 changes: 1 addition & 1 deletion rama-net/src/address/host.rs
Original file line number Diff line number Diff line change
Expand Up @@ -314,7 +314,7 @@ impl<'de> serde::Deserialize<'de> for Host {
where
D: serde::Deserializer<'de>,
{
let s = <&'de str>::deserialize(deserializer)?;
let s = <std::borrow::Cow<'de, str>>::deserialize(deserializer)?;
s.parse().map_err(serde::de::Error::custom)
}
}
Expand Down
2 changes: 1 addition & 1 deletion rama-net/src/address/proxy.rs
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,7 @@ impl<'de> serde::Deserialize<'de> for ProxyAddress {
where
D: serde::Deserializer<'de>,
{
let s = <&'de str>::deserialize(deserializer)?;
let s = <std::borrow::Cow<'de, str>>::deserialize(deserializer)?;
s.parse().map_err(serde::de::Error::custom)
}
}
Expand Down
2 changes: 1 addition & 1 deletion rama-net/src/address/socket_address.rs
Original file line number Diff line number Diff line change
Expand Up @@ -197,7 +197,7 @@ impl<'de> serde::Deserialize<'de> for SocketAddress {
where
D: serde::Deserializer<'de>,
{
let s = <&'de str>::deserialize(deserializer)?;
let s = <std::borrow::Cow<'de, str>>::deserialize(deserializer)?;
s.parse().map_err(serde::de::Error::custom)
}
}
Expand Down
2 changes: 1 addition & 1 deletion rama-net/src/forwarded/node.rs
Original file line number Diff line number Diff line change
Expand Up @@ -374,7 +374,7 @@ impl<'de> serde::Deserialize<'de> for NodeId {
where
D: serde::Deserializer<'de>,
{
let s = <&'de str>::deserialize(deserializer)?;
let s = <std::borrow::Cow<'de, str>>::deserialize(deserializer)?;
s.parse().map_err(serde::de::Error::custom)
}
}
Expand Down
2 changes: 1 addition & 1 deletion rama-net/src/forwarded/obfuscated.rs
Original file line number Diff line number Diff line change
Expand Up @@ -166,7 +166,7 @@ macro_rules! create_obf_type {
where
D: serde::Deserializer<'de>,
{
let s = <&'de str>::deserialize(deserializer)?;
let s = <std::borrow::Cow<'de, str>>::deserialize(deserializer)?;
s.parse().map_err(serde::de::Error::custom)
}
}
Expand Down
4 changes: 2 additions & 2 deletions rama-ua/src/info.rs
Original file line number Diff line number Diff line change
Expand Up @@ -270,7 +270,7 @@ impl<'de> Deserialize<'de> for HttpAgent {
where
D: Deserializer<'de>,
{
let s = <&'de str>::deserialize(deserializer)?;
let s = <std::borrow::Cow<'de, str>>::deserialize(deserializer)?;
match_ignore_ascii_case_str! {
match (s) {
"chrome" | "chromium" => Ok(HttpAgent::Chromium),
Expand Down Expand Up @@ -358,7 +358,7 @@ impl<'de> Deserialize<'de> for TlsAgent {
where
D: Deserializer<'de>,
{
let s = <&'de str>::deserialize(deserializer)?;
let s = <std::borrow::Cow<'de, str>>::deserialize(deserializer)?;
match_ignore_ascii_case_str! {
match (s) {
"rustls" => Ok(TlsAgent::Rustls),
Expand Down
1 change: 1 addition & 0 deletions rama-utils/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ tokio = { workspace = true, features = ["time", "macros"] }

[dev-dependencies]
quickcheck = { workspace = true }
serde_json = { workspace = true }
tokio-test = { workspace = true }

[package.metadata.cargo-public-api-crates]
Expand Down
17 changes: 16 additions & 1 deletion rama-utils/src/str.rs
Original file line number Diff line number Diff line change
Expand Up @@ -163,7 +163,7 @@ impl<'de> serde::Deserialize<'de> for NonEmptyString {
where
D: serde::Deserializer<'de>,
{
let s = <&'de str>::deserialize(deserializer)?;
let s = <Cow<'de, str>>::deserialize(deserializer)?;
s.parse().map_err(serde::de::Error::custom)
}
}
Expand Down Expand Up @@ -203,4 +203,19 @@ mod tests {
#[allow(clippy::needless_borrows_for_generic_args)]
assert_try_into_ok(&String::from("c"));
}

#[test]
fn test_serde_json_compat() {
let source = r##"{"greeting": "Hello", "language": "en"}"##.to_owned();

#[derive(Debug, serde::Deserialize)]
struct Test {
greeting: NonEmptyString,
language: NonEmptyString,
}

let test: Test = serde_json::from_str(&source).unwrap();
assert_eq!("Hello", test.greeting);
assert_eq!("en", test.language);
}
}

0 comments on commit d3391b1

Please sign in to comment.