@@ -26,6 +26,7 @@ use std::{
26
26
result,
27
27
str:: FromStr ,
28
28
} ;
29
+ use strum:: { IntoEnumIterator , EnumCount } ;
29
30
30
31
type Result < T > = result:: Result < T , Error > ;
31
32
@@ -45,6 +46,7 @@ struct Info {
45
46
license : String ,
46
47
custom_logo : Language ,
47
48
custom_colors : Vec < String > ,
49
+ disable_fields : Vec < InfoFields > ,
48
50
}
49
51
50
52
impl fmt:: Display for Info {
@@ -55,35 +57,43 @@ impl fmt::Display for Info {
55
57
None => Color :: White ,
56
58
} ;
57
59
58
- writeln ! (
59
- buffer,
60
- "{}{}" ,
61
- "Project: " . color( color) . bold( ) ,
62
- self . project_name
63
- ) ?;
60
+ if !self . disable_fields . contains ( & InfoFields :: Project ) {
61
+ writeln ! (
62
+ buffer,
63
+ "{}{}" ,
64
+ "Project: " . color( color) . bold( ) ,
65
+ self . project_name
66
+ ) ?;
67
+ }
64
68
65
- writeln ! (
66
- buffer,
67
- "{}{}" ,
68
- "HEAD: " . color( color) . bold( ) ,
69
- self . current_commit
70
- ) ?;
69
+ if !self . disable_fields . contains ( & InfoFields :: HEAD ) {
70
+ writeln ! (
71
+ buffer,
72
+ "{}{}" ,
73
+ "HEAD: " . color( color) . bold( ) ,
74
+ self . current_commit
75
+ ) ?;
76
+ }
71
77
72
- writeln ! (
73
- buffer,
74
- "{}{}" ,
75
- "Version: " . color( color) . bold( ) ,
76
- self . version
77
- ) ?;
78
+ if !self . disable_fields . contains ( & InfoFields :: Version ) {
79
+ writeln ! (
80
+ buffer,
81
+ "{}{}" ,
82
+ "Version: " . color( color) . bold( ) ,
83
+ self . version
84
+ ) ?;
85
+ }
78
86
79
- writeln ! (
80
- buffer,
81
- "{}{}" ,
82
- "Created: " . color( color) . bold( ) ,
83
- self . creation_date
84
- ) ?;
87
+ if !self . disable_fields . contains ( & InfoFields :: Created ) {
88
+ writeln ! (
89
+ buffer,
90
+ "{}{}" ,
91
+ "Created: " . color( color) . bold( ) ,
92
+ self . creation_date
93
+ ) ?;
94
+ }
85
95
86
- if !self . languages . is_empty ( ) {
96
+ if !self . disable_fields . contains ( & InfoFields :: Languages ) && ! self . languages . is_empty ( ) {
87
97
if self . languages . len ( ) > 1 {
88
98
let title = "Languages: " ;
89
99
let pad = " " . repeat ( title. len ( ) ) ;
@@ -108,7 +118,7 @@ impl fmt::Display for Info {
108
118
} ;
109
119
}
110
120
111
- if !self . authors . is_empty ( ) {
121
+ if !self . disable_fields . contains ( & InfoFields :: Authors ) && ! self . authors . is_empty ( ) {
112
122
let title = if self . authors . len ( ) > 1 {
113
123
"Authors: "
114
124
} else {
@@ -124,38 +134,54 @@ impl fmt::Display for Info {
124
134
}
125
135
}
126
136
127
- writeln ! (
128
- buffer,
129
- "{}{}" ,
130
- "Last change: " . color( color) . bold( ) ,
131
- self . last_change
132
- ) ?;
137
+ if !self . disable_fields . contains ( & InfoFields :: LastChange ) {
138
+ writeln ! (
139
+ buffer,
140
+ "{}{}" ,
141
+ "Last change: " . color( color) . bold( ) ,
142
+ self . last_change
143
+ ) ?;
144
+ }
133
145
134
- writeln ! ( buffer, "{}{}" , "Repo: " . color( color) . bold( ) , self . repo) ?;
135
- writeln ! (
136
- buffer,
137
- "{}{}" ,
138
- "Commits: " . color( color) . bold( ) ,
139
- self . commits
140
- ) ?;
141
- writeln ! (
142
- buffer,
143
- "{}{}" ,
144
- "Lines of code: " . color( color) . bold( ) ,
145
- self . number_of_lines
146
- ) ?;
147
- writeln ! (
148
- buffer,
149
- "{}{}" ,
150
- "Size: " . color( color) . bold( ) ,
151
- self . repo_size
152
- ) ?;
153
- writeln ! (
154
- buffer,
155
- "{}{}" ,
156
- "License: " . color( color) . bold( ) ,
157
- self . license
158
- ) ?;
146
+ if !self . disable_fields . contains ( & InfoFields :: Repo ) {
147
+ writeln ! ( buffer, "{}{}" , "Repo: " . color( color) . bold( ) , self . repo) ?;
148
+ }
149
+
150
+ if !self . disable_fields . contains ( & InfoFields :: Commits ) {
151
+ writeln ! (
152
+ buffer,
153
+ "{}{}" ,
154
+ "Commits: " . color( color) . bold( ) ,
155
+ self . commits
156
+ ) ?;
157
+ }
158
+
159
+ if !self . disable_fields . contains ( & InfoFields :: LinesOfCode ) {
160
+ writeln ! (
161
+ buffer,
162
+ "{}{}" ,
163
+ "Lines of code: " . color( color) . bold( ) ,
164
+ self . number_of_lines
165
+ ) ?;
166
+ }
167
+
168
+ if !self . disable_fields . contains ( & InfoFields :: Size ) {
169
+ writeln ! (
170
+ buffer,
171
+ "{}{}" ,
172
+ "Size: " . color( color) . bold( ) ,
173
+ self . repo_size
174
+ ) ?;
175
+ }
176
+
177
+ if !self . disable_fields . contains ( & InfoFields :: License ) {
178
+ writeln ! (
179
+ buffer,
180
+ "{}{}" ,
181
+ "License: " . color( color) . bold( ) ,
182
+ self . license
183
+ ) ?;
184
+ }
159
185
160
186
writeln ! (
161
187
buffer,
@@ -294,6 +320,24 @@ impl fmt::Display for CommitInfo {
294
320
}
295
321
}
296
322
323
+ #[ derive( PartialEq , Eq , EnumString , EnumCount , EnumIter , IntoStaticStr ) ]
324
+ #[ strum( serialize_all = "snake_case" ) ]
325
+ enum InfoFields {
326
+ Project ,
327
+ HEAD ,
328
+ Version ,
329
+ Created ,
330
+ Languages ,
331
+ Authors ,
332
+ LastChange ,
333
+ Repo ,
334
+ Commits ,
335
+ LinesOfCode ,
336
+ Size ,
337
+ License ,
338
+ UnrecognizedField ,
339
+ }
340
+
297
341
#[ derive( PartialEq , Eq , Hash , Clone , EnumString ) ]
298
342
#[ strum( serialize_all = "lowercase" ) ]
299
343
enum Language {
@@ -400,6 +444,26 @@ fn main() -> Result<()> {
400
444
. takes_value ( true )
401
445
. default_value ( "" )
402
446
. help ( "Overrides showing the dominant language ascii logo" ) )
447
+ . arg ( Arg :: with_name ( "disable_field" )
448
+ . long ( "disable" )
449
+ . multiple ( true )
450
+ . takes_value ( true )
451
+ . case_insensitive ( true )
452
+ . possible_values ( & InfoFields :: iter ( )
453
+ . take ( InfoFields :: count ( ) - 1 )
454
+ . map ( |field| field. into ( ) )
455
+ . collect :: < Vec < & str > > ( )
456
+ . as_slice ( ) )
457
+ . possible_value ( "" )
458
+ . hide_possible_values ( true )
459
+ . default_value ( "" )
460
+ . hide_default_value ( true )
461
+ . help ( & format ! ( "Disable fields to show\n Possible values: {:?}" ,
462
+ & InfoFields :: iter( )
463
+ . take( InfoFields :: count( ) - 1 )
464
+ . map( |field| field. into( ) )
465
+ . collect:: <Vec <& str >>( )
466
+ . as_slice( ) ) ) )
403
467
. arg ( Arg :: with_name ( "colors" )
404
468
. short ( "c" )
405
469
. long ( "colors" )
@@ -452,6 +516,18 @@ Possible values: [{0}{1}{2}{3}{4}{5}{6}{7}{8}{9}{10}{11}{12}{13}{14}{15}]",
452
516
. unwrap ( )
453
517
. to_lowercase ( ) )
454
518
. unwrap_or ( Language :: Unknown ) ;
519
+ let disable_fields: Vec < InfoFields > = if let Some ( values) = matches. values_of ( "disable_field" ) {
520
+ values
521
+ . map ( String :: from)
522
+ . filter_map ( |field : String | {
523
+ let item = InfoFields :: from_str ( field. to_lowercase ( ) . as_str ( ) )
524
+ . unwrap_or ( InfoFields :: UnrecognizedField ) ;
525
+ if item == InfoFields :: UnrecognizedField { None } else { Some ( item) }
526
+ } )
527
+ . collect ( )
528
+ } else {
529
+ Vec :: new ( )
530
+ } ;
455
531
456
532
let tokei_langs = project_languages ( & dir) ;
457
533
let languages_stat = get_languages_stat ( & tokei_langs) . ok_or ( Error :: SourceCodeNotFound ) ?;
@@ -489,6 +565,7 @@ Possible values: [{0}{1}{2}{3}{4}{5}{6}{7}{8}{9}{10}{11}{12}{13}{14}{15}]",
489
565
license : project_license ( & dir) ?,
490
566
custom_logo,
491
567
custom_colors,
568
+ disable_fields,
492
569
} ;
493
570
494
571
println ! ( "{}" , info) ;
0 commit comments