1
1
use std:: str:: FromStr ;
2
2
use std:: num:: ParseIntError ;
3
3
use std:: fmt;
4
- use std:: convert:: TryInto ;
5
4
6
5
#[ derive( Debug , Clone , PartialEq , Eq , PartialOrd , Ord ) ]
7
6
pub struct Version {
@@ -10,16 +9,14 @@ pub struct Version {
10
9
11
10
impl fmt:: Display for Version {
12
11
fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
13
- let x = self . parts . iter ( ) . map ( |x| x. to_string ( ) ) . collect :: < Vec < _ > > ( ) . join ( "." ) ;
14
- f. pad ( & x)
12
+ f. pad ( & format ! ( "{}.{}.{}" , self . parts[ 0 ] , self . parts[ 1 ] , self . parts[ 2 ] ) )
15
13
}
16
14
}
17
15
18
16
#[ derive( Debug , PartialEq , Eq ) ]
19
17
pub enum ParseVersionError {
20
18
ParseIntError ( ParseIntError ) ,
21
- // core::array::TryFromSlice is not exported from std, so we invent our own variant
22
- WrongNumberOfParts
19
+ WrongNumberOfParts ,
23
20
}
24
21
25
22
impl From < ParseIntError > for ParseVersionError {
@@ -32,10 +29,23 @@ impl FromStr for Version {
32
29
type Err = ParseVersionError ;
33
30
34
31
fn from_str ( s : & str ) -> Result < Self , Self :: Err > {
35
- let parts: Vec < _ > = s. split ( '.' ) . map ( |part| part. parse ( ) ) . collect :: < Result < _ , _ > > ( ) ?;
36
- Ok ( Self {
37
- parts : parts. as_slice ( ) . try_into ( ) . or ( Err ( ParseVersionError :: WrongNumberOfParts ) ) ?,
38
- } )
32
+ let mut iter = s. split ( '.' ) . map ( |part| Ok ( part. parse ( ) ?) ) ;
33
+
34
+ let parts = {
35
+ let mut part = || {
36
+ iter. next ( )
37
+ . unwrap_or ( Err ( ParseVersionError :: WrongNumberOfParts ) )
38
+ } ;
39
+
40
+ [ part ( ) ?, part ( ) ?, part ( ) ?]
41
+ } ;
42
+
43
+ if let Some ( _) = iter. next ( ) {
44
+ // Ensure we don't have more than 3 parts.
45
+ return Err ( ParseVersionError :: WrongNumberOfParts ) ;
46
+ }
47
+
48
+ Ok ( Self { parts } )
39
49
}
40
50
}
41
51
0 commit comments