Skip to content

Commit bf65b63

Browse files
committed
Make empty_string_is_none generic.
1 parent 76cbdc4 commit bf65b63

2 files changed

Lines changed: 17 additions & 14 deletions

File tree

src/data/user.rs

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -28,19 +28,6 @@ pub struct UserPublicMetrics {
2828
pub listed_count: usize,
2929
}
3030

31-
fn empty_string_is_none<'de, D>(deserializer: D) -> Result<Option<Url>, D::Error>
32-
where
33-
D: serde::Deserializer<'de>,
34-
{
35-
match Option::<&str>::deserialize(deserializer)? {
36-
Some(s) if s.is_empty() => Ok(None),
37-
Some(s) => Url::parse(s)
38-
.map(Option::Some)
39-
.map_err(serde::de::Error::custom),
40-
None => Ok(None),
41-
}
42-
}
43-
4431
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
4532
#[cfg_attr(feature = "arbitrary_precision", derive(Eq))]
4633
pub struct User {
@@ -64,7 +51,7 @@ pub struct User {
6451
#[serde(
6552
default,
6653
skip_serializing_if = "Option::is_none",
67-
deserialize_with = "empty_string_is_none"
54+
deserialize_with = "crate::utils::serde::empty_string_is_none"
6855
)]
6956
pub profile_image_url: Option<Url>,
7057
#[serde(skip_serializing_if = "Option::is_none")]

src/utils/serde.rs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,3 +97,19 @@ pub mod option_duration_mins {
9797
Ok(Option::<i64>::deserialize(deserializer)?.map(Duration::minutes))
9898
}
9999
}
100+
101+
pub fn empty_string_is_none<'de, D, T>(deserializer: D) -> Result<Option<T>, D::Error>
102+
where
103+
D: serde::Deserializer<'de>,
104+
T: std::str::FromStr,
105+
T::Err: std::fmt::Display,
106+
{
107+
match Option::<&str>::deserialize(deserializer)? {
108+
Some(s) if s.is_empty() => Ok(None),
109+
Some(s) => s
110+
.parse()
111+
.map(Option::Some)
112+
.map_err(serde::de::Error::custom),
113+
None => Ok(None),
114+
}
115+
}

0 commit comments

Comments
 (0)