Skip to content

Commit de931f9

Browse files
committed
handle number in rank
1 parent 4beaaec commit de931f9

File tree

1 file changed

+22
-11
lines changed

1 file changed

+22
-11
lines changed

src/deserializers.rs

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,13 @@ enum FlexiBool {
88
String(String),
99
}
1010

11+
#[derive(Deserialize)]
12+
#[serde(untagged)]
13+
enum FlexiString {
14+
String(String),
15+
Number(u64),
16+
}
17+
1118
pub fn empty_is_none<'de, D>(deserializer: D) -> Result<Option<String>, D::Error>
1219
where
1320
D: Deserializer<'de>,
@@ -20,11 +27,17 @@ pub fn optional_u64<'de, D>(deserializer: D) -> Result<Option<u64>, D::Error>
2027
where
2128
D: Deserializer<'de>,
2229
{
23-
let s: Option<String> = Option::deserialize(deserializer)?;
24-
Ok(s.filter(|s| !s.is_empty())
25-
.and_then(|s| s.parse::<i64>().ok())
26-
.filter(|&n| n >= 0)
27-
.map(|n| n as u64))
30+
match Option::<FlexiString>::deserialize(deserializer)? {
31+
Some(FlexiString::String(s)) => {
32+
if s.trim().is_empty() {
33+
Ok(None)
34+
} else {
35+
Ok(Some(s.parse::<u64>().unwrap()))
36+
}
37+
}
38+
Some(FlexiString::Number(n)) => Ok(Some(n)),
39+
None => Ok(None),
40+
}
2841
}
2942

3043
pub fn flexible_bool<'de, D>(deserializer: D) -> Result<Option<bool>, D::Error>
@@ -38,12 +51,10 @@ where
3851
"true" | "yes" | "1" => Ok(Some(true)),
3952
"false" | "no" | "0" => Ok(Some(false)),
4053
"" => Ok(None), // Empty string becomes None
41-
_ => {
42-
Err(de::Error::invalid_value(
43-
de::Unexpected::Str(&s),
44-
&"a valid boolean (true/false, yes/no, 1/0)",
45-
))
46-
}
54+
_ => Err(de::Error::invalid_value(
55+
de::Unexpected::Str(&s),
56+
&"a valid boolean (true/false, yes/no, 1/0)",
57+
)),
4758
}
4859
}
4960
None => Ok(None),

0 commit comments

Comments
 (0)