35
35
36
36
use std:: char;
37
37
use std:: cmp;
38
+ use std:: fmt;
38
39
use std:: option:: { Option , Some , None } ;
39
40
use std:: to_str:: ToStr ;
40
41
@@ -59,13 +60,20 @@ impl cmp::Ord for Identifier {
59
60
}
60
61
}
61
62
63
+ impl fmt:: Show for Identifier {
64
+ #[ inline]
65
+ fn fmt ( version : & Identifier , f : & mut fmt:: Formatter ) -> fmt:: Result {
66
+ match * version {
67
+ Numeric ( ref n) => fmt:: Show :: fmt ( n, f) ,
68
+ AlphaNumeric ( ref s) => fmt:: Show :: fmt ( s, f)
69
+ }
70
+ }
71
+ }
72
+
62
73
impl ToStr for Identifier {
63
74
#[ inline]
64
75
fn to_str ( & self ) -> ~str {
65
- match self {
66
- & Numeric ( n) => n. to_str ( ) ,
67
- & AlphaNumeric ( ref s) => s. to_str ( )
68
- }
76
+ format ! ( "{}" , * self )
69
77
}
70
78
}
71
79
@@ -74,33 +82,45 @@ impl ToStr for Identifier {
74
82
#[ deriving( Clone , Eq ) ]
75
83
pub struct Version {
76
84
/// The major version, to be incremented on incompatible changes.
77
- priv major : uint ,
85
+ major : uint ,
78
86
/// The minor version, to be incremented when functionality is added in a
79
87
/// backwards-compatible manner.
80
- priv minor : uint ,
88
+ minor : uint ,
81
89
/// The patch version, to be incremented when backwards-compatible bug
82
90
/// fixes are made.
83
- priv patch : uint ,
91
+ patch : uint ,
84
92
/// The pre-release version identifier, if one exists.
85
- priv pre: ~[ Identifier ] ,
93
+ pre : ~[ Identifier ] ,
86
94
/// The build metadata, ignored when determining version precedence.
87
- priv build : ~[ Identifier ] ,
95
+ build : ~[ Identifier ] ,
96
+ }
97
+
98
+ impl fmt:: Show for Version {
99
+ #[ inline]
100
+ fn fmt ( version : & Version , f : & mut fmt:: Formatter ) -> fmt:: Result {
101
+ if_ok ! ( write!( f. buf, "{}.{}.{}" , version. major, version. minor, version. patch) )
102
+ if !version. pre . is_empty ( ) {
103
+ if_ok ! ( write!( f. buf, "-" ) ) ;
104
+ for ( i, x) in version. pre . iter ( ) . enumerate ( ) {
105
+ if i != 0 { if_ok ! ( write!( f. buf, "." ) ) } ;
106
+ if_ok ! ( fmt:: Show :: fmt( x, f) ) ;
107
+ }
108
+ }
109
+ if !version. build . is_empty ( ) {
110
+ if_ok ! ( write!( f. buf, "+" ) ) ;
111
+ for ( i, x) in version. build . iter ( ) . enumerate ( ) {
112
+ if i != 0 { if_ok ! ( write!( f. buf, "." ) ) } ;
113
+ if_ok ! ( fmt:: Show :: fmt( x, f) ) ;
114
+ }
115
+ }
116
+ Ok ( ( ) )
117
+ }
88
118
}
89
119
90
120
impl ToStr for Version {
91
121
#[ inline]
92
122
fn to_str ( & self ) -> ~str {
93
- let s = format ! ( "{}.{}.{}" , self . major, self . minor, self . patch) ;
94
- let s = if self . pre . is_empty ( ) {
95
- s
96
- } else {
97
- format ! ( "{}-{}" , s, self . pre. map( |i| i. to_str( ) ) . connect( "." ) )
98
- } ;
99
- if self . build . is_empty ( ) {
100
- s
101
- } else {
102
- format ! ( "{}+{}" , s, self . build. map( |i| i. to_str( ) ) . connect( "." ) )
103
- }
123
+ format ! ( "{}" , * self )
104
124
}
105
125
}
106
126
@@ -365,6 +385,22 @@ fn test_ne() {
365
385
assert!(parse(" 1.2 . 3 +23 ") != parse(" 1.2 . 3 +42 "));
366
386
}
367
387
388
+ #[test]
389
+ fn test_show() {
390
+ assert_eq!(format!(" { } ", parse(" 1.2 . 3 ").unwrap()), ~" 1.2 . 3 ");
391
+ assert_eq!(format!(" { } ", parse(" 1.2 . 3 -alpha1").unwrap()), ~" 1.2 . 3 -alpha1");
392
+ assert_eq!(format!(" { } ", parse(" 1.2 . 3 +build. 42 ").unwrap()), ~" 1.2 . 3 +build. 42 ");
393
+ assert_eq!(format!(" { } ", parse(" 1.2 . 3 -alpha1+42 ").unwrap()), ~" 1.2 . 3 -alpha1+42 ");
394
+ }
395
+
396
+ #[test]
397
+ fn test_to_str() {
398
+ assert_eq!(parse(" 1.2 . 3 ").unwrap().to_str(), ~" 1.2 . 3 ");
399
+ assert_eq!(parse(" 1.2 . 3 -alpha1").unwrap().to_str(), ~" 1.2 . 3 -alpha1");
400
+ assert_eq!(parse(" 1.2 . 3 +build. 42 ").unwrap().to_str(), ~" 1.2 . 3 +build. 42 ");
401
+ assert_eq!(parse(" 1.2 . 3 -alpha1+42 ").unwrap().to_str(), ~" 1.2 . 3 -alpha1+42 ");
402
+ }
403
+
368
404
#[test]
369
405
fn test_lt() {
370
406
assert!(parse(" 0.0 . 0 ") < parse(" 1.2 . 3 -alpha2"));
0 commit comments