@@ -13,13 +13,14 @@ use from_str::from_str;
13
13
use iter:: Iterator ;
14
14
use libc:: exit;
15
15
use option:: { Some , None , Option } ;
16
+ use os;
16
17
use rt:: crate_map:: { ModEntry , CrateMap , iter_crate_map, get_crate_map} ;
17
- use str:: StrSlice ;
18
+ use str:: { Str , StrSlice } ;
18
19
use vec:: { ImmutableVector , MutableTotalOrdVector , OwnedVector } ;
19
- # [ cfg ( test ) ] use cast :: transmute ;
20
+ use vec_ng :: Vec ;
20
21
21
- struct LogDirective {
22
- name : Option < ~ str > ,
22
+ struct LogDirective < ' a > {
23
+ name : Option < & ' a str > ,
23
24
level : u32
24
25
}
25
26
@@ -58,36 +59,39 @@ fn parse_log_level(level: &str) -> Option<u32> {
58
59
/// and return a vector with log directives.
59
60
/// Valid log levels are 0-255, with the most likely ones being 1-4 (defined in std::).
60
61
/// Also supports string log levels of error, warn, info, and debug
61
- fn parse_logging_spec ( spec : ~ str ) -> ~ [ LogDirective ] {
62
- let mut dirs = ~ [ ] ;
62
+ fn parse_logging_spec < ' a > ( spec : & ' a str ) -> Vec < LogDirective < ' a > > {
63
+ let mut dirs = Vec :: new ( ) ;
63
64
for s in spec. split ( ',' ) {
64
- let parts: ~[ & str ] = s. split ( '=' ) . collect ( ) ;
65
- let mut log_level;
66
- let mut name = Some ( parts[ 0 ] . to_owned ( ) ) ;
67
- match parts. len ( ) {
68
- 1 => {
65
+ if s. len ( ) == 0 { continue }
66
+ let mut parts = s. split ( '=' ) ;
67
+ let log_level;
68
+ let name;
69
+ match ( parts. next ( ) , parts. next ( ) , parts. next ( ) ) {
70
+ ( Some ( part0) , None , None ) => {
69
71
//if the single argument is a log-level string or number,
70
72
//treat that as a global fallback
71
- let possible_log_level = parse_log_level ( parts [ 0 ] ) ;
73
+ let possible_log_level = parse_log_level ( part0 ) ;
72
74
match possible_log_level {
73
75
Some ( num) => {
74
76
name = None ;
75
77
log_level = num;
76
78
} ,
77
- _ => {
78
- log_level = MAX_LOG_LEVEL
79
+ None => {
80
+ log_level = MAX_LOG_LEVEL ;
81
+ name = Some ( part0) ;
79
82
}
80
83
}
81
84
}
82
- 2 => {
83
- let possible_log_level = parse_log_level ( parts [ 1 ] ) ;
85
+ ( Some ( part0 ) , Some ( part1 ) , None ) => {
86
+ let possible_log_level = parse_log_level ( part1 ) ;
84
87
match possible_log_level {
85
88
Some ( num) => {
89
+ name = Some ( part0) ;
86
90
log_level = num;
87
91
} ,
88
92
_ => {
89
93
rterrln ! ( "warning: invalid logging spec '{}', \
90
- ignoring it", parts [ 1 ] ) ;
94
+ ignoring it", part1 ) ;
91
95
continue
92
96
}
93
97
}
@@ -98,8 +102,7 @@ fn parse_logging_spec(spec: ~str) -> ~[LogDirective]{
98
102
continue
99
103
}
100
104
}
101
- let dir = LogDirective { name : name, level : log_level} ;
102
- dirs. push ( dir) ;
105
+ dirs. push ( LogDirective { name : name, level : log_level } ) ;
103
106
}
104
107
return dirs;
105
108
}
@@ -134,27 +137,24 @@ fn update_entry(dirs: &[LogDirective], entry: &ModEntry) -> u32 {
134
137
135
138
/// Set log level for every entry in crate_map according to the sepecification
136
139
/// in settings
137
- fn update_log_settings( crate_map : & CrateMap , settings : ~str ) {
138
- let mut dirs = ~[ ] ;
139
- if settings. len ( ) > 0 {
140
- if settings == ~":: help" || settings == ~"?" {
141
- rterrln ! ( "\n Crate log map:\n " ) ;
140
+ fn update_log_settings ( crate_map : & CrateMap , settings : & str ) {
141
+ if settings == "::help" || settings == "?" {
142
+ rterrln ! ( "\n Crate log map:\n " ) ;
142
143
143
- let mut entries = ~ [ ] ;
144
- iter_crate_map ( crate_map, |entry| entries. push ( entry. name . to_owned ( ) ) ) ;
145
- entries. sort ( ) ;
144
+ let mut entries = Vec :: new ( ) ;
145
+ iter_crate_map ( crate_map, |entry| entries. push ( entry. name ) ) ;
146
+ entries. as_mut_slice ( ) . sort ( ) ;
146
147
147
- for name in entries. iter ( ) {
148
- rterrln ! ( " {}" , * name) ;
149
- }
150
- unsafe { exit ( 1 ) ; }
148
+ for name in entries. iter ( ) {
149
+ rterrln ! ( " {}" , * name) ;
151
150
}
152
- dirs = parse_logging_spec ( settings ) ;
151
+ unsafe { exit ( 1 ) ; }
153
152
}
153
+ let dirs = parse_logging_spec ( settings) ;
154
154
155
155
let mut n_matches: u32 = 0 ;
156
156
iter_crate_map ( crate_map, |entry| {
157
- let m = update_entry ( dirs, entry) ;
157
+ let m = update_entry ( dirs. as_slice ( ) , entry) ;
158
158
n_matches += m;
159
159
} ) ;
160
160
@@ -169,18 +169,12 @@ fn update_log_settings(crate_map: &CrateMap, settings: ~str) {
169
169
/// Configure logging by traversing the crate map and setting the
170
170
/// per-module global logging flags based on the logging spec
171
171
pub fn init ( ) {
172
- use os;
173
-
174
172
let log_spec = os:: getenv ( "RUST_LOG" ) ;
175
173
match get_crate_map ( ) {
176
174
Some ( crate_map) => {
177
175
match log_spec {
178
- Some ( spec) => {
179
- update_log_settings ( crate_map, spec) ;
180
- }
181
- None => {
182
- update_log_settings ( crate_map, ~"") ;
183
- }
176
+ Some ( spec) => update_log_settings ( crate_map, spec. as_slice ( ) ) ,
177
+ None => update_log_settings ( crate_map, "" ) ,
184
178
}
185
179
} ,
186
180
_ => {
@@ -197,124 +191,124 @@ pub fn init() {
197
191
// Tests for parse_logging_spec()
198
192
#[ test]
199
193
fn parse_logging_spec_valid ( ) {
200
- let dirs = parse_logging_spec ( ~"crate1:: mod1=1 , crate1:: mod2, crate2=4 ") ;
194
+ let dirs = parse_logging_spec ( "crate1::mod1=1,crate1::mod2,crate2=4" ) ;
195
+ let dirs = dirs. as_slice ( ) ;
201
196
assert_eq ! ( dirs. len( ) , 3 ) ;
202
- assert !( dirs[ 0 ] . name == Some ( ~ "crate1:: mod1"));
197
+ assert_eq ! ( dirs[ 0 ] . name, Some ( "crate1::mod1" ) ) ;
203
198
assert_eq ! ( dirs[ 0 ] . level, 1 ) ;
204
199
205
- assert !(dirs[1].name == Some(~ " crate1:: mod2"));
200
+ assert_eq ! ( dirs[ 1 ] . name, Some ( "crate1::mod2" ) ) ;
206
201
assert_eq ! ( dirs[ 1 ] . level, MAX_LOG_LEVEL ) ;
207
202
208
- assert !(dirs[2].name == Some(~ " crate2"));
203
+ assert_eq ! ( dirs[ 2 ] . name, Some ( "crate2" ) ) ;
209
204
assert_eq ! ( dirs[ 2 ] . level, 4 ) ;
210
205
}
211
206
212
207
#[ test]
213
208
fn parse_logging_spec_invalid_crate ( ) {
214
209
// test parse_logging_spec with multiple = in specification
215
- let dirs = parse_logging_spec(~" crate1:: mod1=1 =2 , crate2=4 ");
210
+ let dirs = parse_logging_spec ( "crate1::mod1=1=2,crate2=4" ) ;
211
+ let dirs = dirs. as_slice ( ) ;
216
212
assert_eq ! ( dirs. len( ) , 1 ) ;
217
- assert !(dirs[0].name == Some(~ " crate2"));
213
+ assert_eq ! ( dirs[ 0 ] . name, Some ( "crate2" ) ) ;
218
214
assert_eq ! ( dirs[ 0 ] . level, 4 ) ;
219
215
}
220
216
221
217
#[ test]
222
218
fn parse_logging_spec_invalid_log_level ( ) {
223
219
// test parse_logging_spec with 'noNumber' as log level
224
- let dirs = parse_logging_spec(~" crate1:: mod1=noNumber, crate2=4 ");
220
+ let dirs = parse_logging_spec ( "crate1::mod1=noNumber,crate2=4" ) ;
221
+ let dirs = dirs. as_slice ( ) ;
225
222
assert_eq ! ( dirs. len( ) , 1 ) ;
226
- assert !(dirs[0].name == Some(~ " crate2"));
223
+ assert_eq ! ( dirs[ 0 ] . name, Some ( "crate2" ) ) ;
227
224
assert_eq ! ( dirs[ 0 ] . level, 4 ) ;
228
225
}
229
226
230
227
#[ test]
231
228
fn parse_logging_spec_string_log_level ( ) {
232
229
// test parse_logging_spec with 'warn' as log level
233
- let dirs = parse_logging_spec(~" crate1:: mod1=wrong, crate2=warn");
230
+ let dirs = parse_logging_spec ( "crate1::mod1=wrong,crate2=warn" ) ;
231
+ let dirs = dirs. as_slice ( ) ;
234
232
assert_eq ! ( dirs. len( ) , 1 ) ;
235
- assert !(dirs[0].name == Some(~ " crate2"));
233
+ assert_eq ! ( dirs[ 0 ] . name, Some ( "crate2" ) ) ;
236
234
assert_eq ! ( dirs[ 0 ] . level, 2 ) ;
237
235
}
238
236
239
237
#[ test]
240
238
fn parse_logging_spec_global ( ) {
241
239
// test parse_logging_spec with no crate
242
- let dirs = parse_logging_spec(~" warn, crate2=4 ");
240
+ let dirs = parse_logging_spec ( "warn,crate2=4" ) ;
241
+ let dirs = dirs. as_slice ( ) ;
243
242
assert_eq ! ( dirs. len( ) , 2 ) ;
244
- assert !(dirs[0].name == None);
243
+ assert_eq ! ( dirs[ 0 ] . name, None ) ;
245
244
assert_eq ! ( dirs[ 0 ] . level, 2 ) ;
246
- assert !(dirs[1].name == Some(~ " crate2"));
245
+ assert_eq ! ( dirs[ 1 ] . name, Some ( "crate2" ) ) ;
247
246
assert_eq ! ( dirs[ 1 ] . level, 4 ) ;
248
247
}
249
248
250
249
// Tests for update_entry
251
250
#[ test]
252
251
fn update_entry_match_full_path ( ) {
253
- let dirs = ~[LogDirective {name: Some(~" crate1:: mod1"), level: 2 },
254
- LogDirective {name: Some(~" crate2"), level: 3}];
255
- let level = &mut 0;
256
- unsafe {
257
- let entry= &ModEntry {name:" crate1:: mod1", log_level: level};
258
- let m = update_entry(dirs, transmute(entry));
259
- assert!(*entry.log_level == 2);
260
- assert!(m == 1);
252
+ let dirs = [ LogDirective { name : Some ( "crate1::mod1" ) , level : 2 } ,
253
+ LogDirective { name : Some ( "crate2" ) , level : 3 } ] ;
254
+ let mut level = 0 ;
255
+ {
256
+ let entry = & ModEntry { name : "crate1::mod1" , log_level : & mut level } ;
257
+ assert_eq ! ( update_entry( dirs, entry) , 1 ) ;
261
258
}
259
+ assert_eq ! ( level, 2 ) ;
262
260
}
263
261
264
262
#[ test]
265
263
fn update_entry_no_match ( ) {
266
- let dirs = ~[LogDirective {name: Some(~" crate1:: mod1"), level: 2 },
267
- LogDirective {name: Some(~" crate2"), level: 3}];
268
- let level = &mut 0;
269
- unsafe {
270
- let entry= &ModEntry {name: " crate3:: mod1", log_level: level};
271
- let m = update_entry(dirs, transmute(entry));
272
- assert!(*entry.log_level == DEFAULT_LOG_LEVEL);
273
- assert!(m == 0);
264
+ let dirs = [ LogDirective { name : Some ( "crate1::mod1" ) , level : 2 } ,
265
+ LogDirective { name : Some ( "crate2" ) , level : 3 } ] ;
266
+ let mut level = 0 ;
267
+ {
268
+ let entry = & ModEntry { name : "crate3::mod1" , log_level : & mut level } ;
269
+ assert_eq ! ( update_entry( dirs, entry) , 0 ) ;
274
270
}
271
+ assert_eq ! ( level, DEFAULT_LOG_LEVEL ) ;
275
272
}
276
273
277
274
#[ test]
278
275
fn update_entry_match_beginning ( ) {
279
- let dirs = ~[LogDirective {name: Some(~" crate1:: mod1"), level: 2 },
280
- LogDirective {name: Some(~" crate2"), level: 3}];
281
- let level = &mut 0;
282
- unsafe {
283
- let entry= &ModEntry {name: " crate2:: mod1", log_level: level};
284
- let m = update_entry(dirs, transmute(entry));
285
- assert!(*entry.log_level == 3);
286
- assert!(m == 1);
276
+ let dirs = [ LogDirective { name : Some ( "crate1::mod1" ) , level : 2 } ,
277
+ LogDirective { name : Some ( "crate2" ) , level : 3 } ] ;
278
+ let mut level = 0 ;
279
+ {
280
+ let entry= & ModEntry { name : "crate2::mod1" , log_level : & mut level} ;
281
+ assert_eq ! ( update_entry( dirs, entry) , 1 ) ;
287
282
}
283
+ assert_eq ! ( level, 3 ) ;
288
284
}
289
285
290
286
#[ test]
291
287
fn update_entry_match_beginning_longest_match ( ) {
292
- let dirs = ~[LogDirective {name: Some(~" crate1:: mod1"), level: 2 },
293
- LogDirective {name: Some(~" crate2"), level: 3},
294
- LogDirective {name: Some(~" crate2:: mod "), level: 4}];
295
- let level = &mut 0;
296
- unsafe {
297
- let entry = &ModEntry {name: " crate2:: mod1", log_level: level};
298
- let m = update_entry(dirs, transmute(entry));
299
- assert!(*entry.log_level == 4);
300
- assert!(m == 1);
288
+ let dirs = [ LogDirective { name : Some ( "crate1::mod1" ) , level : 2 } ,
289
+ LogDirective { name : Some ( "crate2" ) , level : 3 } ,
290
+ LogDirective { name : Some ( "crate2::mod" ) , level : 4 } ] ;
291
+ let mut level = 0 ;
292
+ {
293
+ let entry = & ModEntry { name : "crate2::mod1" , log_level : & mut level } ;
294
+ assert_eq ! ( update_entry( dirs, entry) , 1 ) ;
301
295
}
296
+ assert_eq ! ( level, 4 ) ;
302
297
}
303
298
304
299
#[ test]
305
300
fn update_entry_match_default ( ) {
306
- let dirs = ~[LogDirective {name: Some(~" crate1:: mod1"), level: 2 },
307
- LogDirective {name: None, level: 3}
308
- ];
309
- let level = &mut 0;
310
- unsafe {
311
- let entry= &ModEntry {name: " crate1:: mod1", log_level: level};
312
- let m = update_entry(dirs, transmute(entry));
313
- assert!(*entry.log_level == 2);
314
- assert!(m == 1);
315
- let entry= &ModEntry {name: " crate2:: mod2" , log_level: level} ;
316
- let m = update_entry( dirs, transmute( entry) ) ;
317
- assert!( * entry. log_level == 3 ) ;
318
- assert!( m == 1 ) ;
301
+ let dirs = [ LogDirective { name : Some ( "crate1::mod1" ) , level : 2 } ,
302
+ LogDirective { name : None , level : 3 } ] ;
303
+ let mut level = 0 ;
304
+ {
305
+ let entry = & ModEntry { name : "crate1::mod1" , log_level : & mut level } ;
306
+ assert_eq ! ( update_entry( dirs, entry) , 1 ) ;
307
+ }
308
+ assert_eq ! ( level, 2 ) ;
309
+ {
310
+ let entry = & ModEntry { name : "crate2::mod2" , log_level : & mut level } ;
311
+ assert_eq ! ( update_entry( dirs, entry) , 1 ) ;
319
312
}
313
+ assert_eq ! ( level, 3 ) ;
320
314
}
0 commit comments