@@ -8,6 +8,7 @@ use colored::*;
8
8
use git2:: Repository ;
9
9
use license:: License ;
10
10
use std:: {
11
+ collections:: HashMap ,
11
12
convert:: From ,
12
13
ffi:: OsStr ,
13
14
fmt,
@@ -23,7 +24,8 @@ type Result<T> = result::Result<T, Error>;
23
24
struct Info {
24
25
project_name : String ,
25
26
version : String ,
26
- language : Language ,
27
+ dominant_language : Language ,
28
+ languages : Vec < ( Language , f64 ) > ,
27
29
authors : Vec < String > ,
28
30
repo : String ,
29
31
commits : String ,
@@ -52,12 +54,26 @@ impl fmt::Display for Info {
52
54
"Version: " . color( color) . bold( ) ,
53
55
self . version
54
56
) ?;
55
- writeln ! (
56
- buffer,
57
- "{}{}" ,
58
- "Language: " . color( color) . bold( ) ,
59
- self . language
60
- ) ?;
57
+
58
+ if !self . languages . is_empty ( ) {
59
+ if self . languages . len ( ) > 1 {
60
+ let title = "Languages: " ;
61
+ let mut s = String :: from ( "" ) ;
62
+ for language in self . languages . iter ( ) {
63
+ let formatted_number = format ! ( "{:.*}" , 1 , language. 1 ) ;
64
+ s. push_str ( & ( language. 0 . to_string ( ) + " " + & formatted_number. to_string ( ) + "% " ) ) ;
65
+ }
66
+ writeln ! ( buffer, "{}{}" , title. color( color) . bold( ) , s) ?;
67
+ } else {
68
+ let title = "Language: " ;
69
+ writeln ! (
70
+ buffer,
71
+ "{}{}" ,
72
+ title. color( color) . bold( ) ,
73
+ self . dominant_language
74
+ ) ?;
75
+ } ;
76
+ }
61
77
62
78
if !self . authors . is_empty ( ) {
63
79
let title = if self . authors . len ( ) > 1 {
@@ -176,6 +192,7 @@ fn true_len(line: &str) -> usize {
176
192
. len ( )
177
193
}
178
194
195
+ #[ derive( PartialEq , Eq , Hash , Clone ) ]
179
196
enum Language {
180
197
C ,
181
198
Clojure ,
@@ -223,13 +240,16 @@ impl fmt::Display for Language {
223
240
}
224
241
225
242
fn main ( ) -> Result < ( ) > {
226
- let tokei_langs = project_languages ( ) ;
227
- let language = get_dominant_language ( & tokei_langs) . ok_or ( Error :: SourceCodeNotFound ) ?;
228
-
229
243
if !is_git_installed ( ) {
230
244
return Err ( Error :: GitNotInstalled ) ;
231
245
}
232
246
247
+ let tokei_langs = project_languages ( ) ;
248
+ let languages_stat = get_languages_stat ( & tokei_langs) ;
249
+ let mut languages_stat_vec: Vec < ( _ , _ ) > = languages_stat. into_iter ( ) . collect ( ) ;
250
+ languages_stat_vec. sort_by ( |a, b| a. 1 . partial_cmp ( & b. 1 ) . unwrap ( ) . reverse ( ) ) ;
251
+ let dominant_language = languages_stat_vec[ 0 ] . 0 . clone ( ) ;
252
+
233
253
let authors = get_authors ( 3 ) ;
234
254
let config = get_configuration ( ) ?;
235
255
let version = get_version ( ) ?;
@@ -238,7 +258,8 @@ fn main() -> Result<()> {
238
258
let info = Info {
239
259
project_name : config. repository_name ,
240
260
version,
241
- language,
261
+ dominant_language,
262
+ languages : languages_stat_vec,
242
263
authors,
243
264
repo : config. repository_url ,
244
265
commits,
@@ -257,6 +278,24 @@ fn project_languages() -> tokei::Languages {
257
278
languages
258
279
}
259
280
281
+ fn get_languages_stat ( languages : & tokei:: Languages ) -> HashMap < Language , f64 > {
282
+ let mut stats = HashMap :: new ( ) ;
283
+
284
+ let sum_language_code: usize = languages
285
+ . remove_empty ( )
286
+ . iter ( )
287
+ . map ( |( _, v) | v. code ) . sum ( ) ;
288
+
289
+ for ( k, v) in languages. remove_empty ( ) . iter ( ) {
290
+ let code = v. code as f64 ;
291
+ stats. insert (
292
+ Language :: from ( * * k) ,
293
+ ( code / sum_language_code as f64 ) * 100.00 ,
294
+ ) ;
295
+ }
296
+ stats
297
+ }
298
+
260
299
fn project_license ( ) -> Result < String > {
261
300
let output = fs:: read_dir ( "." )
262
301
. map_err ( |_| Error :: ReadDirectory ) ?
@@ -409,16 +448,6 @@ fn get_authors(n: usize) -> Vec<String> {
409
448
authors
410
449
}
411
450
412
- /// Traverse current directory and search for dominant
413
- /// language using tokei.
414
- fn get_dominant_language ( languages : & tokei:: Languages ) -> Option < Language > {
415
- languages
416
- . remove_empty ( )
417
- . iter ( )
418
- . max_by_key ( |( _, v) | v. code )
419
- . map ( |( k, _) | Language :: from ( * * k) )
420
- }
421
-
422
451
fn get_total_loc ( languages : & tokei:: Languages ) -> usize {
423
452
languages
424
453
. values ( )
@@ -479,7 +508,7 @@ fn get_all_language_types() -> Vec<tokei::LanguageType> {
479
508
480
509
impl Info {
481
510
pub fn get_ascii ( & self ) -> & str {
482
- match self . language {
511
+ match self . dominant_language {
483
512
Language :: C => include_str ! ( "../resources/c.ascii" ) ,
484
513
Language :: Clojure => include_str ! ( "../resources/clojure.ascii" ) ,
485
514
Language :: Cpp => include_str ! ( "../resources/cpp.ascii" ) ,
@@ -503,7 +532,7 @@ impl Info {
503
532
}
504
533
505
534
fn colors ( & self ) -> Vec < Color > {
506
- match self . language {
535
+ match self . dominant_language {
507
536
Language :: C => vec ! [ Color :: BrightBlue , Color :: Blue ] ,
508
537
Language :: Clojure => vec ! [ Color :: BrightBlue , Color :: BrightGreen ] ,
509
538
Language :: Cpp => vec ! [ Color :: Yellow ] ,
0 commit comments