1- use serde:: { Deserialize , Deserializer , Serialize , de} ;
1+ use crate :: deserializers:: { empty_is_none, flexible_bool, optional_u64} ;
2+
3+ use serde:: { Deserialize , Serialize } ;
24
35#[ derive( Debug , Clone , Deserialize , Serialize ) ]
46pub enum ProvideStrategy {
@@ -44,52 +46,15 @@ impl PackageProvide {
4446 }
4547}
4648
47- fn empty_is_none < ' de , D > ( deserializer : D ) -> Result < Option < String > , D :: Error >
48- where
49- D : Deserializer < ' de > ,
50- {
51- let s: Option < String > = Option :: deserialize ( deserializer) ?;
52- Ok ( s. filter ( |s| !s. is_empty ( ) ) )
53- }
54-
55- fn optional_number < ' de , D > ( deserializer : D ) -> Result < Option < u64 > , D :: Error >
56- where
57- D : Deserializer < ' de > ,
58- {
59- let s: Option < String > = Option :: deserialize ( deserializer) ?;
60- Ok ( s. filter ( |s| !s. is_empty ( ) )
61- . and_then ( |s| s. parse :: < i64 > ( ) . ok ( ) )
62- . filter ( |& n| n >= 0 )
63- . map ( |n| n as u64 ) )
64- }
65-
66- fn opt_boolean_from_string < ' de , D > ( deserializer : D ) -> Result < Option < bool > , D :: Error >
67- where
68- D : Deserializer < ' de > ,
69- {
70- let s: Option < String > = Deserialize :: deserialize ( deserializer) ?;
71- s. map ( |s| match s. to_lowercase ( ) . as_str ( ) {
72- "true" | "yes" | "1" => Some ( true ) ,
73- "false" | "no" | "0" => Some ( false ) ,
74- _ => None ,
75- } )
76- . ok_or_else ( || {
77- de:: Error :: invalid_value (
78- de:: Unexpected :: Option ,
79- & "a valid boolean (true/false, yes/no, 1/0)" ,
80- )
81- } )
82- }
83-
8449#[ derive( Debug , Default , Clone , Deserialize , Serialize ) ]
8550pub struct RemotePackage {
86- #[ serde( deserialize_with = "opt_boolean_from_string " , alias = "_disabled" ) ]
51+ #[ serde( deserialize_with = "flexible_bool " , alias = "_disabled" ) ]
8752 pub disabled : Option < bool > ,
8853
8954 #[ serde( alias = "_disabled_reason" ) ]
9055 pub disabled_reason : Option < serde_json:: Value > ,
9156
92- #[ serde( default , deserialize_with = "optional_number " ) ]
57+ #[ serde( default , deserialize_with = "optional_u64 " ) ]
9358 pub rank : Option < u64 > ,
9459
9560 #[ serde( default , deserialize_with = "empty_is_none" ) ]
@@ -115,13 +80,13 @@ pub struct RemotePackage {
11580
11681 pub download_url : String ,
11782
118- #[ serde( default , deserialize_with = "optional_number " ) ]
83+ #[ serde( default , deserialize_with = "optional_u64 " ) ]
11984 pub size_raw : Option < u64 > ,
12085
12186 #[ serde( default , deserialize_with = "empty_is_none" ) ]
12287 pub ghcr_pkg : Option < String > ,
12388
124- #[ serde( default , deserialize_with = "optional_number " ) ]
89+ #[ serde( default , deserialize_with = "optional_u64 " ) ]
12590 pub ghcr_size_raw : Option < u64 > ,
12691
12792 pub ghcr_files : Option < Vec < String > > ,
@@ -188,49 +153,49 @@ pub struct RemotePackage {
188153 #[ serde( default , deserialize_with = "empty_is_none" ) ]
189154 pub app_id : Option < String > ,
190155
191- #[ serde( default , deserialize_with = "optional_number " ) ]
156+ #[ serde( default , deserialize_with = "optional_u64 " ) ]
192157 pub download_count : Option < u64 > ,
193158
194- #[ serde( default , deserialize_with = "optional_number " ) ]
159+ #[ serde( default , deserialize_with = "optional_u64 " ) ]
195160 pub download_count_month : Option < u64 > ,
196161
197- #[ serde( default , deserialize_with = "optional_number " ) ]
162+ #[ serde( default , deserialize_with = "optional_u64 " ) ]
198163 pub download_count_week : Option < u64 > ,
199164
200- #[ serde( default , deserialize_with = "opt_boolean_from_string " ) ]
165+ #[ serde( default , deserialize_with = "flexible_bool " ) ]
201166 pub bundle : Option < bool > ,
202167
203168 #[ serde( default , deserialize_with = "empty_is_none" ) ]
204169 pub bundle_type : Option < String > ,
205170
206- #[ serde( default , deserialize_with = "opt_boolean_from_string " ) ]
171+ #[ serde( default , deserialize_with = "flexible_bool " ) ]
207172 pub soar_syms : Option < bool > ,
208173
209- #[ serde( default , deserialize_with = "opt_boolean_from_string " ) ]
174+ #[ serde( default , deserialize_with = "flexible_bool " ) ]
210175 pub deprecated : Option < bool > ,
211176
212- #[ serde( default , deserialize_with = "opt_boolean_from_string " ) ]
177+ #[ serde( default , deserialize_with = "flexible_bool " ) ]
213178 pub desktop_integration : Option < bool > ,
214179
215- #[ serde( default , deserialize_with = "opt_boolean_from_string " ) ]
180+ #[ serde( default , deserialize_with = "flexible_bool " ) ]
216181 pub external : Option < bool > ,
217182
218- #[ serde( default , deserialize_with = "opt_boolean_from_string " ) ]
183+ #[ serde( default , deserialize_with = "flexible_bool " ) ]
219184 pub installable : Option < bool > ,
220185
221- #[ serde( default , deserialize_with = "opt_boolean_from_string " ) ]
186+ #[ serde( default , deserialize_with = "flexible_bool " ) ]
222187 pub portable : Option < bool > ,
223188
224- #[ serde( default , deserialize_with = "opt_boolean_from_string " ) ]
189+ #[ serde( default , deserialize_with = "flexible_bool " ) ]
225190 pub recurse_provides : Option < bool > ,
226191
227- #[ serde( default , deserialize_with = "opt_boolean_from_string " ) ]
192+ #[ serde( default , deserialize_with = "flexible_bool " ) ]
228193 pub trusted : Option < bool > ,
229194
230195 #[ serde( default , deserialize_with = "empty_is_none" ) ]
231196 pub version_latest : Option < String > ,
232197
233- #[ serde( default , deserialize_with = "opt_boolean_from_string " ) ]
198+ #[ serde( default , deserialize_with = "flexible_bool " ) ]
234199 pub version_outdated : Option < bool > ,
235200
236201 pub repology : Option < Vec < String > > ,
0 commit comments