@@ -62,8 +62,6 @@ impl LanguagesInfo {
6262
6363impl std:: fmt:: Display for LanguagesInfo {
6464 fn fmt ( & self , f : & mut std:: fmt:: Formatter ) -> std:: fmt:: Result {
65- let mut languages_info = String :: new ( ) ;
66- let pad = self . title ( ) . len ( ) + 2 ;
6765 let color_palette = [
6866 DynColors :: Ansi ( AnsiColors :: Red ) ,
6967 DynColors :: Ansi ( AnsiColors :: Green ) ,
@@ -73,43 +71,9 @@ impl std::fmt::Display for LanguagesInfo {
7371 DynColors :: Ansi ( AnsiColors :: Cyan ) ,
7472 ] ;
7573
76- let languages: Vec < ( String , f64 , DynColors ) > = {
77- let mut iter = self . languages_with_percentage . iter ( ) . enumerate ( ) . map (
78- |(
79- i,
80- & LanguageWithPercentage {
81- language,
82- percentage,
83- } ,
84- ) | {
85- let circle_color = if self . true_color {
86- language. get_circle_color ( )
87- } else {
88- color_palette[ i % color_palette. len ( ) ]
89- } ;
90- ( language. to_string ( ) , percentage, circle_color)
91- } ,
92- ) ;
93- if self . languages_with_percentage . len ( ) > self . number_of_languages {
94- let mut languages = iter
95- . by_ref ( )
96- . take ( self . number_of_languages )
97- . collect :: < Vec < _ > > ( ) ;
98- let other_perc = iter. fold ( 0.0 , |acc, x| acc + x. 1 ) ;
99- languages. push ( (
100- "Other" . to_string ( ) ,
101- other_perc,
102- DynColors :: Ansi ( AnsiColors :: White ) ,
103- ) ) ;
104- languages
105- } else {
106- iter. collect ( )
107- }
108- } ;
109-
110- let language_bar: String = build_language_bar ( & languages) ;
74+ let languages: Vec < ( String , f64 , DynColors ) > = prepare_languages ( self , & color_palette) ;
11175
112- languages_info. push_str ( & language_bar ) ;
76+ let mut languages_info = build_language_bar ( & languages ) ;
11377
11478 for ( i, ( language, perc, circle_color) ) in languages. iter ( ) . enumerate ( ) {
11579 let formatted_number = format ! ( "{:.*}" , 1 , perc) ;
@@ -125,16 +89,59 @@ impl std::fmt::Display for LanguagesInfo {
12589 "\n {:<width$}{}" ,
12690 "" ,
12791 language_str,
128- width = pad
129- ) ?;
92+ width = self . title( ) . len( ) + 2
93+ )
94+ . unwrap ( ) ;
13095 } else {
13196 languages_info. push_str ( language_str. trim_end ( ) ) ;
13297 }
13398 }
99+
134100 write ! ( f, "{languages_info}" )
135101 }
136102}
137103
104+ fn prepare_languages (
105+ languages_info : & LanguagesInfo ,
106+ color_palette : & [ DynColors ] ,
107+ ) -> Vec < ( String , f64 , DynColors ) > {
108+ let mut iter = languages_info
109+ . languages_with_percentage
110+ . iter ( )
111+ . enumerate ( )
112+ . map (
113+ |(
114+ i,
115+ & LanguageWithPercentage {
116+ language,
117+ percentage,
118+ } ,
119+ ) | {
120+ let circle_color = if languages_info. true_color {
121+ language. get_circle_color ( )
122+ } else {
123+ color_palette[ i % color_palette. len ( ) ]
124+ } ;
125+ ( language. to_string ( ) , percentage, circle_color)
126+ } ,
127+ ) ;
128+ if languages_info. languages_with_percentage . len ( ) > languages_info. number_of_languages {
129+ let mut languages = iter
130+ . by_ref ( )
131+ . take ( languages_info. number_of_languages )
132+ . collect :: < Vec < _ > > ( ) ;
133+ let other_perc = iter. fold ( 0.0 , |acc, x| acc + x. 1 ) ;
134+ languages. push ( (
135+ "Other" . to_string ( ) ,
136+ other_perc,
137+ DynColors :: Ansi ( AnsiColors :: White ) ,
138+ ) ) ;
139+ languages
140+ } else {
141+ iter. collect ( )
142+ }
143+ }
144+
138145fn build_language_bar ( languages : & [ ( String , f64 , DynColors ) ] ) -> String {
139146 languages
140147 . iter ( )
@@ -286,4 +293,58 @@ mod test {
286293
287294 assert_eq ! ( result, expected_result) ;
288295 }
296+
297+ #[ test]
298+ fn test_prepare_languages ( ) {
299+ let languages_info = LanguagesInfo {
300+ languages_with_percentage : vec ! [
301+ LanguageWithPercentage {
302+ language: Language :: Go ,
303+ percentage: 40_f64 ,
304+ } ,
305+ LanguageWithPercentage {
306+ language: Language :: Erlang ,
307+ percentage: 30_f64 ,
308+ } ,
309+ LanguageWithPercentage {
310+ language: Language :: Java ,
311+ percentage: 20_f64 ,
312+ } ,
313+ LanguageWithPercentage {
314+ language: Language :: Rust ,
315+ percentage: 10_f64 ,
316+ } ,
317+ ] ,
318+ true_color : false ,
319+ number_of_languages : 2 ,
320+ info_color : DynColors :: Ansi ( AnsiColors :: White ) ,
321+ } ;
322+
323+ let color_palette = [
324+ DynColors :: Ansi ( AnsiColors :: Red ) ,
325+ DynColors :: Ansi ( AnsiColors :: Green ) ,
326+ ] ;
327+
328+ let result = prepare_languages ( & languages_info, & color_palette) ;
329+
330+ let expected_result = vec ! [
331+ (
332+ Language :: Go . to_string( ) ,
333+ 40_f64 ,
334+ DynColors :: Ansi ( AnsiColors :: Red ) ,
335+ ) ,
336+ (
337+ Language :: Erlang . to_string( ) ,
338+ 30_f64 ,
339+ DynColors :: Ansi ( AnsiColors :: Green ) ,
340+ ) ,
341+ (
342+ "Other" . to_string( ) ,
343+ 30_f64 ,
344+ DynColors :: Ansi ( AnsiColors :: White ) ,
345+ ) ,
346+ ] ;
347+
348+ assert_eq ! ( result, expected_result) ;
349+ }
289350}
0 commit comments