Skip to content

Commit 9b54c9b

Browse files
committed
refacto languageInfo fmt method
1 parent 6539e3b commit 9b54c9b

File tree

1 file changed

+101
-40
lines changed

1 file changed

+101
-40
lines changed

src/info/langs/language.rs

Lines changed: 101 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,6 @@ impl LanguagesInfo {
6262

6363
impl 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+
138145
fn 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

Comments
 (0)