From e51b8220dc700eed259e4b25f23820da2683d7a5 Mon Sep 17 00:00:00 2001 From: Benedict Date: Sat, 12 Nov 2016 19:23:06 +0100 Subject: loc: added new flag --summary With this new flag the lines of code for each file type and the total lines of code will be printed at the end. --- Cargo.toml | 2 +- src/main.rs | 63 +++++++++++++++++++++++++++++++++++++++++++++---------------- 2 files changed, 48 insertions(+), 17 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 3ab30ca..02a5b64 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "loc" version = "0.1.0" -authors = ["Benedict Boerger "] +authors = ["Benedict "] [dependencies] clap = "2.7.0" diff --git a/src/main.rs b/src/main.rs index a19e43d..c07ad3a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -8,6 +8,12 @@ use clap::{App, Arg}; mod config; + +struct FileTypeStats{ + file_type: String, + count: i64, +} + fn omit_line(line: String, in_comment_section: &mut bool, comment_tokens: &config::CommentTokens) -> bool { let s = line.trim(); let begin_comment_section = s.starts_with(comment_tokens.begin_comment_block.as_str()); @@ -37,14 +43,14 @@ fn get_config<'a>(config: &'a Vec, extension: &str) -> Op None } -fn count_lines(filename: &str, config: &mut Vec) -> Result{ +fn count_lines(filename: &str, file_type_stats: &mut Vec, + config: &mut Vec) -> Result{ let mut sum = 0; let mut in_comment_section = false; - // do we have config for this type of file? let extension = match Path::new(filename).extension() { Some(ext) => ext.to_str().unwrap(), - None => return Err(Error::new(std::io::ErrorKind::Other, "could not get extension")), + None => return Err(Error::new(std::io::ErrorKind::Other, "could not get file extension")), }; let comment_tokens = match get_config(&config, extension) { @@ -59,22 +65,35 @@ fn count_lines(filename: &str, config: &mut Vec) -> Resul } sum += 1; } + + let mut to_add = false; + { + let file = file_type_stats.iter_mut().find(|x| x.file_type == extension); + match file { + Some(mut e) => e.count += sum, + None => to_add = true, + } + } + if to_add { + file_type_stats.push(FileTypeStats { file_type: extension.to_string(), count: sum }); + } Ok(sum) } -fn count_files_for_dir(dir: PathBuf, mut sum: &mut i32, mut config: &mut Vec) { +fn count_files_for_dir(dir: PathBuf, mut file_types: &mut Vec, + mut config: &mut Vec) { match dir.read_dir() { Ok(iter) => { for entry in iter { match entry { Ok(i) => { if i.path().is_dir() { - count_files_for_dir(i.path(), &mut sum, - &mut config); + count_files_for_dir(i.path(), + &mut file_types, &mut config); } else { count_lines_for_file(i.path().to_str().unwrap(), - &mut sum, &mut config); + &mut file_types, &mut config); } }, Err(e) => println!("error: {}", e), } @@ -84,28 +103,33 @@ fn count_files_for_dir(dir: PathBuf, mut sum: &mut i32, mut config: &mut Vec) { - match count_lines(filename, &mut config) { +fn count_lines_for_file(filename: &str, mut file_type_stats: &mut Vec, + mut config: &mut Vec) { + match count_lines(filename, &mut file_type_stats, &mut config) { Ok(i) => { println!("{}\t: {}", i, filename); - *sum += i; }, + }, Err(e) => println!("error for file {}: {}", filename, e), } } fn main() { - let m = App::new("loc").about("Count lines of code. Without parameter read recursive all + let m = App::new("loc").about("Count lines of code. Without parameter read recursive all \ files from current directory and count lines of code\ for each") .version(crate_version!()) - .author("Benedict Börger ") + .author(crate_authors!()) .arg(Arg::with_name("file") .help("files to count lines of code") .short("f") .long("file") .takes_value(true) .multiple(true)) + .arg(Arg::with_name("summary") + .help("Print a summary for each file type") + .short("s") + .long("summary")) .get_matches(); let mut config = match config::read_config() { @@ -113,19 +137,26 @@ fn main() { Ok(i) => i, }; - let mut sum = 0; + let mut file_types = Vec::new(); if let Some(files) = m.values_of("file") { for file in files { - count_lines_for_file(file, &mut sum, &mut config) + count_lines_for_file(file, &mut file_types, &mut config) } } else { match std::env::current_dir() { - Ok(i) => count_files_for_dir(i, &mut sum, &mut config), + Ok(i) => count_files_for_dir(i, &mut file_types, &mut config), Err(e) => panic!("could not determine current dir: {}", e), } } - println!("{}\t: total", sum); + if m.is_present("summary") { + let mut sum = 0; + for f in file_types { + println!("{}\t: *.{}", f.count, f.file_type); + sum += f.count; + } + println!("{}\t: total", sum); + } } -- cgit v1.2.3-70-g09d2