33
44use crate :: error:: ArchiveError :: InvalidVersion ;
55use crate :: error:: { ArchiveError , Result } ;
6+ use serde:: { Deserialize , Serialize } ;
67use std:: fmt;
78use std:: str:: FromStr ;
89
@@ -124,6 +125,25 @@ impl FromStr for Version {
124125 }
125126}
126127
128+ impl < ' de > Deserialize < ' de > for Version {
129+ fn deserialize < D > ( deserializer : D ) -> Result < Self , D :: Error >
130+ where
131+ D : serde:: Deserializer < ' de > ,
132+ {
133+ let version = String :: deserialize ( deserializer) ?;
134+ Version :: from_str ( & version) . map_err ( serde:: de:: Error :: custom)
135+ }
136+ }
137+
138+ impl Serialize for Version {
139+ fn serialize < S > ( & self , serializer : S ) -> Result < S :: Ok , S :: Error >
140+ where
141+ S : serde:: Serializer ,
142+ {
143+ self . to_string ( ) . serialize ( serializer)
144+ }
145+ }
146+
127147#[ cfg( test) ]
128148mod tests {
129149 use super :: * ;
@@ -134,7 +154,7 @@ mod tests {
134154 //
135155
136156 #[ test]
137- fn matches_all ( ) {
157+ fn test_matches_all ( ) {
138158 assert ! ( & Version :: new( 1 , None , None ) . matches( & Version :: new( 1 , None , None ) ) ) ;
139159 assert ! ( !& Version :: new( 1 , None , None ) . matches( & Version :: new( 2 , None , None ) ) ) ;
140160
@@ -156,23 +176,23 @@ mod tests {
156176 //
157177
158178 #[ test]
159- fn version_display ( ) -> Result < ( ) > {
179+ fn test_version_display ( ) -> Result < ( ) > {
160180 let version_str = "1.2.3" ;
161181 let version = Version :: from_str ( version_str) ?;
162182 assert_eq ! ( version_str, version. to_string( ) ) ;
163183 Ok ( ( ) )
164184 }
165185
166186 #[ test]
167- fn version_display_major ( ) -> Result < ( ) > {
187+ fn test_version_display_major ( ) -> Result < ( ) > {
168188 let version_str = "1" ;
169189 let version = Version :: from_str ( version_str) ?;
170190 assert_eq ! ( version_str, version. to_string( ) ) ;
171191 Ok ( ( ) )
172192 }
173193
174194 #[ test]
175- fn version_display_major_minor ( ) -> Result < ( ) > {
195+ fn test_version_display_major_minor ( ) -> Result < ( ) > {
176196 let version_str = "1.2" ;
177197 let version = Version :: from_str ( version_str) ?;
178198 assert_eq ! ( version_str, version. to_string( ) ) ;
@@ -184,7 +204,7 @@ mod tests {
184204 //
185205
186206 #[ test]
187- fn version_from_str ( ) -> Result < ( ) > {
207+ fn test_version_from_str ( ) -> Result < ( ) > {
188208 let version = Version :: from_str ( "1.2.3" ) ?;
189209 assert_eq ! ( version. major, 1u64 ) ;
190210 assert_eq ! ( version. minor, Some ( 2 ) ) ;
@@ -193,7 +213,7 @@ mod tests {
193213 }
194214
195215 #[ test]
196- fn version_from_str_major ( ) -> Result < ( ) > {
216+ fn test_version_from_str_major ( ) -> Result < ( ) > {
197217 let version = Version :: from_str ( "1" ) ?;
198218 assert_eq ! ( version. major, 1 ) ;
199219 assert_eq ! ( version. minor, None ) ;
@@ -202,7 +222,7 @@ mod tests {
202222 }
203223
204224 #[ test]
205- fn version_from_str_major_minor ( ) -> Result < ( ) > {
225+ fn test_version_from_str_major_minor ( ) -> Result < ( ) > {
206226 let version = Version :: from_str ( "1.2" ) ?;
207227 assert_eq ! ( version. major, 1 ) ;
208228 assert_eq ! ( version. minor, Some ( 2 ) ) ;
@@ -211,27 +231,57 @@ mod tests {
211231 }
212232
213233 #[ test]
214- fn version_from_str_error_missing_major ( ) {
234+ fn test_version_from_str_error_missing_major ( ) {
215235 assert ! ( Version :: from_str( "" ) . is_err( ) ) ;
216236 }
217237
218238 #[ test]
219- fn version_from_str_error_invalid_major ( ) {
239+ fn test_version_from_str_error_invalid_major ( ) {
220240 assert ! ( Version :: from_str( "a" ) . is_err( ) ) ;
221241 }
222242
223243 #[ test]
224- fn version_from_str_error_invalid_minor ( ) {
244+ fn test_version_from_str_error_invalid_minor ( ) {
225245 assert ! ( Version :: from_str( "1.a" ) . is_err( ) ) ;
226246 }
227247
228248 #[ test]
229- fn version_from_str_error_invalid_release ( ) {
249+ fn test_version_from_str_error_invalid_release ( ) {
230250 assert ! ( Version :: from_str( "1.2.a" ) . is_err( ) ) ;
231251 }
232252
233253 #[ test]
234- fn version_from_str_error_too_many_parts ( ) {
254+ fn test_version_from_str_error_too_many_parts ( ) {
235255 assert ! ( Version :: from_str( "1.2.3.4" ) . is_err( ) ) ;
236256 }
257+
258+ //
259+ // Deserialize tests
260+ //
261+
262+ #[ test]
263+ fn test_version_deserialize ( ) -> anyhow:: Result < ( ) > {
264+ let version = serde_json:: from_str :: < Version > ( "\" 1.2.3\" " ) ?;
265+ assert_eq ! ( version. major, 1u64 ) ;
266+ assert_eq ! ( version. minor, Some ( 2 ) ) ;
267+ assert_eq ! ( version. release, Some ( 3 ) ) ;
268+ Ok ( ( ) )
269+ }
270+
271+ #[ test]
272+ fn test_version_deserialize_parse_error ( ) {
273+ assert ! ( serde_json:: from_str:: <Version >( "\" foo\" " ) . is_err( ) )
274+ }
275+
276+ //
277+ // Serialize tests
278+ //
279+
280+ #[ test]
281+ fn test_version_serialize ( ) -> anyhow:: Result < ( ) > {
282+ let version = Version :: new ( 1 , Some ( 2 ) , Some ( 3 ) ) ;
283+ let version_str = serde_json:: to_string ( & version) ?;
284+ assert_eq ! ( version_str, "\" 1.2.3\" " ) ;
285+ Ok ( ( ) )
286+ }
237287}
0 commit comments