@@ -24,26 +24,15 @@ use Terminal;
24
24
use Result ;
25
25
use self :: searcher:: get_dbpath_for_term;
26
26
use self :: parser:: compiled:: parse;
27
- use self :: parm:: { expand, Variables , Param } ;
27
+ use self :: parm:: { expand, Param , Variables } ;
28
28
use self :: Error :: * ;
29
29
30
-
31
30
/// Returns true if the named terminal supports basic ANSI escape codes.
32
31
fn is_ansi ( name : & str ) -> bool {
33
32
// SORTED! We binary search this.
34
33
static ANSI_TERM_PREFIX : & ' static [ & ' static str ] = & [
35
- "Eterm" ,
36
- "ansi" ,
37
- "eterm" ,
38
- "iterm" ,
39
- "konsole" ,
40
- "linux" ,
41
- "mrxvt" ,
42
- "msyscon" ,
43
- "rxvt" ,
44
- "screen" ,
45
- "tmux" ,
46
- "xterm" ,
34
+ "Eterm" , "ansi" , "eterm" , "iterm" , "konsole" , "linux" , "mrxvt" , "msyscon" , "rxvt" ,
35
+ "screen" , "tmux" , "xterm" ,
47
36
] ;
48
37
match ANSI_TERM_PREFIX . binary_search ( & name) {
49
38
Ok ( _) => true ,
@@ -52,7 +41,6 @@ fn is_ansi(name: &str) -> bool {
52
41
}
53
42
}
54
43
55
-
56
44
/// A parsed terminfo database entry.
57
45
#[ derive( Debug , Clone ) ]
58
46
pub struct TermInfo {
@@ -70,16 +58,15 @@ impl TermInfo {
70
58
/// Create a `TermInfo` based on current environment.
71
59
pub fn from_env ( ) -> Result < TermInfo > {
72
60
let term_var = env:: var ( "TERM" ) . ok ( ) ;
73
- let term_name = term_var
74
- . as_ref ( )
75
- . map ( |s| & * * s)
76
- . or_else ( || env:: var ( "MSYSCON" )
77
- . ok ( )
78
- . and_then ( |s| if s == "mintty.exe" {
79
- Some ( "msyscon" )
80
- } else {
81
- None
82
- } ) ) ;
61
+ let term_name = term_var. as_ref ( ) . map ( |s| & * * s) . or_else ( || {
62
+ env:: var ( "MSYSCON" ) . ok ( ) . and_then ( |s| {
63
+ if s == "mintty.exe" {
64
+ Some ( "msyscon" )
65
+ } else {
66
+ None
67
+ }
68
+ } )
69
+ } ) ;
83
70
if let Some ( term_name) = term_name {
84
71
return TermInfo :: from_name ( term_name) ;
85
72
} else {
@@ -93,7 +80,7 @@ impl TermInfo {
93
80
match TermInfo :: from_path ( & path) {
94
81
Ok ( term) => return Ok ( term) ,
95
82
// Skip IO Errors (e.g., permission denied).
96
- Err ( :: Error :: Io ( _) ) => { } ,
83
+ Err ( :: Error :: Io ( _) ) => { }
97
84
// Don't ignore malformed terminfo databases.
98
85
Err ( e) => return Err ( e) ,
99
86
}
@@ -131,23 +118,21 @@ impl TermInfo {
131
118
// might do this for
132
119
// us. Alas. )
133
120
fn _from_path ( path : & Path ) -> Result < TermInfo > {
134
- let file = try! ( File :: open ( path) . map_err ( :: Error :: Io ) ) ;
121
+ let file = File :: open ( path) . map_err ( :: Error :: Io ) ? ;
135
122
let mut reader = BufReader :: new ( file) ;
136
123
parse ( & mut reader, false )
137
124
}
138
125
139
126
/// Retrieve a capability `cmd` and expand it with `params`, writing result to `out`.
140
127
pub fn apply_cap ( & self , cmd : & str , params : & [ Param ] , out : & mut io:: Write ) -> Result < ( ) > {
141
128
match self . strings . get ( cmd) {
142
- Some ( cmd) => {
143
- match expand ( cmd, params, & mut Variables :: new ( ) ) {
144
- Ok ( s) => {
145
- try!( out. write_all ( & s) ) ;
146
- Ok ( ( ) )
147
- }
148
- Err ( e) => Err ( e. into ( ) ) ,
129
+ Some ( cmd) => match expand ( cmd, params, & mut Variables :: new ( ) ) {
130
+ Ok ( s) => {
131
+ out. write_all ( & s) ?;
132
+ Ok ( ( ) )
149
133
}
150
- }
134
+ Err ( e) => Err ( e. into ( ) ) ,
135
+ } ,
151
136
None => Err ( :: Error :: NotSupported ) ,
152
137
}
153
138
}
@@ -156,24 +141,23 @@ impl TermInfo {
156
141
pub fn reset ( & self , out : & mut io:: Write ) -> Result < ( ) > {
157
142
// are there any terminals that have color/attrs and not sgr0?
158
143
// Try falling back to sgr, then op
159
- let cmd = match [ ( "sgr0" , & [ ] as & [ Param ] ) , ( "sgr" , & [ Param :: Number ( 0 ) ] ) , ( "op" , & [ ] ) ]
160
- . iter ( )
161
- . filter_map ( | & ( cap , params ) | {
162
- self . strings . get ( cap ) . map ( |c| ( c , params ) )
163
- } )
164
- . next ( ) {
165
- Some ( ( op , params ) ) => {
166
- match expand ( op , params , & mut Variables :: new ( ) ) {
167
- Ok ( cmd ) => cmd ,
168
- Err ( e ) => return Err ( e . into ( ) ) ,
169
- }
170
- }
144
+ let cmd = match [
145
+ ( "sgr0" , & [ ] as & [ Param ] ) ,
146
+ ( "sgr" , & [ Param :: Number ( 0 ) ] ) ,
147
+ ( "op" , & [ ] ) ,
148
+ ] . iter ( )
149
+ . filter_map ( | & ( cap , params ) | self . strings . get ( cap ) . map ( |c| ( c , params ) ) )
150
+ . next ( )
151
+ {
152
+ Some ( ( op , params ) ) => match expand ( op , params , & mut Variables :: new ( ) ) {
153
+ Ok ( cmd ) => cmd ,
154
+ Err ( e ) => return Err ( e . into ( ) ) ,
155
+ } ,
171
156
None => return Err ( :: Error :: NotSupported ) ,
172
157
} ;
173
- try! ( out. write_all ( & cmd) ) ;
158
+ out. write_all ( & cmd) ? ;
174
159
Ok ( ( ) )
175
160
}
176
-
177
161
}
178
162
179
163
#[ derive( Debug , Eq , PartialEq ) ]
@@ -255,7 +239,6 @@ pub mod parser {
255
239
}
256
240
pub mod parm;
257
241
258
-
259
242
fn cap_for_attr ( attr : Attr ) -> & ' static str {
260
243
match attr {
261
244
Attr :: Bold => "bold" ,
@@ -288,15 +271,17 @@ impl<T: Write> Terminal for TerminfoTerminal<T> {
288
271
fn fg ( & mut self , color : color:: Color ) -> Result < ( ) > {
289
272
let color = self . dim_if_necessary ( color) ;
290
273
if self . num_colors > color {
291
- return self . ti . apply_cap ( "setaf" , & [ Param :: Number ( color as i32 ) ] , & mut self . out ) ;
274
+ return self . ti
275
+ . apply_cap ( "setaf" , & [ Param :: Number ( color as i32 ) ] , & mut self . out ) ;
292
276
}
293
277
Err ( :: Error :: ColorOutOfRange )
294
278
}
295
279
296
280
fn bg ( & mut self , color : color:: Color ) -> Result < ( ) > {
297
281
let color = self . dim_if_necessary ( color) ;
298
282
if self . num_colors > color {
299
- return self . ti . apply_cap ( "setab" , & [ Param :: Number ( color as i32 ) ] , & mut self . out ) ;
283
+ return self . ti
284
+ . apply_cap ( "setab" , & [ Param :: Number ( color as i32 ) ] , & mut self . out ) ;
300
285
}
301
286
Err ( :: Error :: ColorOutOfRange )
302
287
}
@@ -324,7 +309,9 @@ impl<T: Write> Terminal for TerminfoTerminal<T> {
324
309
}
325
310
326
311
fn supports_reset ( & self ) -> bool {
327
- [ "sgr0" , "sgr" , "op" ] . iter ( ) . any ( |& cap| self . ti . strings . get ( cap) . is_some ( ) )
312
+ [ "sgr0" , "sgr" , "op" ]
313
+ . iter ( )
314
+ . any ( |& cap| self . ti . strings . get ( cap) . is_some ( ) )
328
315
}
329
316
330
317
fn supports_color ( & self ) -> bool {
@@ -352,7 +339,8 @@ impl<T: Write> Terminal for TerminfoTerminal<T> {
352
339
}
353
340
354
341
fn into_inner ( self ) -> T
355
- where Self : Sized
342
+ where
343
+ Self : Sized ,
356
344
{
357
345
self . out
358
346
}
@@ -361,8 +349,8 @@ impl<T: Write> Terminal for TerminfoTerminal<T> {
361
349
impl < T : Write > TerminfoTerminal < T > {
362
350
/// Create a new TerminfoTerminal with the given TermInfo and Write.
363
351
pub fn new_with_terminfo ( out : T , terminfo : TermInfo ) -> TerminfoTerminal < T > {
364
- let nc = if terminfo. strings . contains_key ( "setaf" ) &&
365
- terminfo . strings . contains_key ( "setab" ) {
352
+ let nc = if terminfo. strings . contains_key ( "setaf" ) && terminfo . strings . contains_key ( "setab" )
353
+ {
366
354
terminfo. numbers . get ( "colors" ) . map_or ( 0 , |& n| n)
367
355
} else {
368
356
0
@@ -379,7 +367,9 @@ impl<T: Write> TerminfoTerminal<T> {
379
367
///
380
368
/// Returns `None` when the terminfo cannot be found or parsed.
381
369
pub fn new ( out : T ) -> Option < TerminfoTerminal < T > > {
382
- TermInfo :: from_env ( ) . map ( move |ti| TerminfoTerminal :: new_with_terminfo ( out, ti) ) . ok ( )
370
+ TermInfo :: from_env ( )
371
+ . map ( move |ti| TerminfoTerminal :: new_with_terminfo ( out, ti) )
372
+ . ok ( )
383
373
}
384
374
385
375
fn dim_if_necessary ( & self , color : color:: Color ) -> color:: Color {
@@ -391,7 +381,6 @@ impl<T: Write> TerminfoTerminal<T> {
391
381
}
392
382
}
393
383
394
-
395
384
impl < T : Write > Write for TerminfoTerminal < T > {
396
385
fn write ( & mut self , buf : & [ u8 ] ) -> io:: Result < usize > {
397
386
self . out . write ( buf)
0 commit comments