1
1
use style:: Colours ;
2
+ use output:: file_name:: { FileStyle , Classify } ;
2
3
3
4
use options:: { flags, Vars , Misfire } ;
4
5
use options:: parser:: MatchedFlags ;
@@ -59,36 +60,70 @@ impl TerminalColours {
59
60
}
60
61
61
62
62
- impl Colours {
63
- pub fn deduce < V , TW > ( matches : & MatchedFlags , vars : & V , widther : TW ) -> Result < Colours , Misfire >
63
+ pub struct Style {
64
+ pub colours : Colours ,
65
+ pub style : FileStyle ,
66
+ }
67
+
68
+ impl Style {
69
+
70
+ #[ allow( trivial_casts) ] // the "as Box<_>" stuff below warns about this for some reason
71
+ pub fn deduce < V , TW > ( matches : & MatchedFlags , vars : & V , widther : TW ) -> Result < Self , Misfire >
64
72
where TW : Fn ( ) -> Option < usize > , V : Vars {
65
73
use self :: TerminalColours :: * ;
74
+ use info:: filetype:: FileExtensions ;
66
75
use style:: LSColors ;
67
76
use options:: vars;
77
+ use output:: file_name:: NoFileColours ;
78
+
79
+ let classify = Classify :: deduce ( matches) ?;
68
80
69
81
let tc = TerminalColours :: deduce ( matches) ?;
70
82
if tc == Never || ( tc == Automatic && widther ( ) . is_none ( ) ) {
71
- return Ok ( Colours :: plain ( ) ) ;
83
+ return Ok ( Style {
84
+ colours : Colours :: plain ( ) ,
85
+ style : FileStyle { classify, exts : Box :: new ( NoFileColours ) } ,
86
+ } ) ;
72
87
}
73
88
74
89
let scale = matches. has_where ( |f| f. matches ( & flags:: COLOR_SCALE ) || f. matches ( & flags:: COLOUR_SCALE ) ) ?;
75
90
let mut colours = Colours :: colourful ( scale. is_some ( ) ) ;
76
91
77
92
if let Some ( lsc) = vars. get ( vars:: LS_COLORS ) {
78
93
let lsc = lsc. to_string_lossy ( ) ;
79
- LSColors ( lsc. as_ref ( ) ) . each_pair ( |pair| colours. set_ls ( & pair) ) ;
94
+ LSColors ( lsc. as_ref ( ) ) . each_pair ( |pair| {
95
+ colours. set_ls ( & pair) ;
96
+ } ) ;
80
97
}
81
98
82
99
if let Some ( exa) = vars. get ( vars:: EXA_COLORS ) {
83
100
let exa = exa. to_string_lossy ( ) ;
84
- LSColors ( exa. as_ref ( ) ) . each_pair ( |pair| colours. set_exa ( & pair) ) ;
101
+ LSColors ( exa. as_ref ( ) ) . each_pair ( |pair| {
102
+ colours. set_exa ( & pair) ;
103
+ } ) ;
85
104
}
86
105
87
- Ok ( colours)
106
+ let classify = Classify :: deduce ( matches) ?;
107
+ let exts = if colours. colourful { Box :: new ( FileExtensions ) as Box < _ > }
108
+ else { Box :: new ( NoFileColours ) as Box < _ > } ;
109
+
110
+ let style = FileStyle { classify, exts } ;
111
+ Ok ( Style { colours, style } )
88
112
}
89
113
}
90
114
91
115
116
+ impl Classify {
117
+ fn deduce ( matches : & MatchedFlags ) -> Result < Classify , Misfire > {
118
+ let flagged = matches. has ( & flags:: CLASSIFY ) ?;
119
+
120
+ Ok ( if flagged { Classify :: AddFileIndicators }
121
+ else { Classify :: JustFilenames } )
122
+ }
123
+ }
124
+
125
+
126
+
92
127
#[ cfg( test) ]
93
128
mod terminal_test {
94
129
use super :: * ;
@@ -174,7 +209,7 @@ mod colour_test {
174
209
( $name: ident: $inputs: expr, $widther: expr; $stricts: expr => $result: expr) => {
175
210
#[ test]
176
211
fn $name( ) {
177
- for result in parse_for_test( $inputs. as_ref( ) , TEST_ARGS , $stricts, |mf| Colours :: deduce( mf, & None , & $widther) ) {
212
+ for result in parse_for_test( $inputs. as_ref( ) , TEST_ARGS , $stricts, |mf| Style :: deduce( mf, & None , & $widther) . map ( |s| s . colours ) ) {
178
213
assert_eq!( result, $result) ;
179
214
}
180
215
}
@@ -183,7 +218,7 @@ mod colour_test {
183
218
( $name: ident: $inputs: expr, $widther: expr; $stricts: expr => err $result: expr) => {
184
219
#[ test]
185
220
fn $name( ) {
186
- for result in parse_for_test( $inputs. as_ref( ) , TEST_ARGS , $stricts, |mf| Colours :: deduce( mf, & None , & $widther) ) {
221
+ for result in parse_for_test( $inputs. as_ref( ) , TEST_ARGS , $stricts, |mf| Style :: deduce( mf, & None , & $widther) . map ( |s| s . colours ) ) {
187
222
assert_eq!( result. unwrap_err( ) , $result) ;
188
223
}
189
224
}
@@ -192,7 +227,7 @@ mod colour_test {
192
227
( $name: ident: $inputs: expr, $widther: expr; $stricts: expr => like $pat: pat) => {
193
228
#[ test]
194
229
fn $name( ) {
195
- for result in parse_for_test( $inputs. as_ref( ) , TEST_ARGS , $stricts, |mf| Colours :: deduce( mf, & None , & $widther) ) {
230
+ for result in parse_for_test( $inputs. as_ref( ) , TEST_ARGS , $stricts, |mf| Style :: deduce( mf, & None , & $widther) . map ( |s| s . colours ) ) {
196
231
println!( "Testing {:?}" , result) ;
197
232
match result {
198
233
$pat => assert!( true ) ,
@@ -245,7 +280,7 @@ mod customs_test {
245
280
246
281
let vars = MockVars { ls: $ls, exa: $exa } ;
247
282
248
- for result in parse_for_test( & [ ] , & [ ] , Both , |mf| Colours :: deduce( mf, & vars, || Some ( 80 ) ) ) {
283
+ for result in parse_for_test( & [ ] , & [ ] , Both , |mf| Style :: deduce( mf, & vars, || Some ( 80 ) ) . map ( |s| s . colours ) ) {
249
284
assert_eq!( result. as_ref( ) , Ok ( & c) ) ;
250
285
}
251
286
}
0 commit comments