Skip to content

Commit 511323a

Browse files
committed
multiple language stats
1 parent 6e5ca58 commit 511323a

File tree

1 file changed

+52
-23
lines changed

1 file changed

+52
-23
lines changed

Diff for: src/main.rs

+52-23
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ use colored::*;
88
use git2::Repository;
99
use license::License;
1010
use std::{
11+
collections::HashMap,
1112
convert::From,
1213
ffi::OsStr,
1314
fmt,
@@ -23,7 +24,8 @@ type Result<T> = result::Result<T, Error>;
2324
struct Info {
2425
project_name: String,
2526
version: String,
26-
language: Language,
27+
dominant_language: Language,
28+
languages: Vec<(Language, f64)>,
2729
authors: Vec<String>,
2830
repo: String,
2931
commits: String,
@@ -52,12 +54,26 @@ impl fmt::Display for Info {
5254
"Version: ".color(color).bold(),
5355
self.version
5456
)?;
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+
}
6177

6278
if !self.authors.is_empty() {
6379
let title = if self.authors.len() > 1 {
@@ -176,6 +192,7 @@ fn true_len(line: &str) -> usize {
176192
.len()
177193
}
178194

195+
#[derive(PartialEq, Eq, Hash, Clone)]
179196
enum Language {
180197
C,
181198
Clojure,
@@ -223,13 +240,16 @@ impl fmt::Display for Language {
223240
}
224241

225242
fn main() -> Result<()> {
226-
let tokei_langs = project_languages();
227-
let language = get_dominant_language(&tokei_langs).ok_or(Error::SourceCodeNotFound)?;
228-
229243
if !is_git_installed() {
230244
return Err(Error::GitNotInstalled);
231245
}
232246

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+
233253
let authors = get_authors(3);
234254
let config = get_configuration()?;
235255
let version = get_version()?;
@@ -238,7 +258,8 @@ fn main() -> Result<()> {
238258
let info = Info {
239259
project_name: config.repository_name,
240260
version,
241-
language,
261+
dominant_language,
262+
languages: languages_stat_vec,
242263
authors,
243264
repo: config.repository_url,
244265
commits,
@@ -257,6 +278,24 @@ fn project_languages() -> tokei::Languages {
257278
languages
258279
}
259280

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+
260299
fn project_license() -> Result<String> {
261300
let output = fs::read_dir(".")
262301
.map_err(|_| Error::ReadDirectory)?
@@ -409,16 +448,6 @@ fn get_authors(n: usize) -> Vec<String> {
409448
authors
410449
}
411450

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-
422451
fn get_total_loc(languages: &tokei::Languages) -> usize {
423452
languages
424453
.values()
@@ -479,7 +508,7 @@ fn get_all_language_types() -> Vec<tokei::LanguageType> {
479508

480509
impl Info {
481510
pub fn get_ascii(&self) -> &str {
482-
match self.language {
511+
match self.dominant_language {
483512
Language::C => include_str!("../resources/c.ascii"),
484513
Language::Clojure => include_str!("../resources/clojure.ascii"),
485514
Language::Cpp => include_str!("../resources/cpp.ascii"),
@@ -503,7 +532,7 @@ impl Info {
503532
}
504533

505534
fn colors(&self) -> Vec<Color> {
506-
match self.language {
535+
match self.dominant_language {
507536
Language::C => vec![Color::BrightBlue, Color::Blue],
508537
Language::Clojure => vec![Color::BrightBlue, Color::BrightGreen],
509538
Language::Cpp => vec![Color::Yellow],

0 commit comments

Comments
 (0)