@@ -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+
1118pub fn empty_is_none < ' de , D > ( deserializer : D ) -> Result < Option < String > , D :: Error >
1219where
1320 D : Deserializer < ' de > ,
@@ -20,11 +27,17 @@ pub fn optional_u64<'de, D>(deserializer: D) -> Result<Option<u64>, D::Error>
2027where
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
3043pub 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