sloc 0.0.1

source lines of count
extern crate clap;
use clap::{Arg,App};

mod files;
use files::get_files;
mod counting;
use counting::{Stats, Counter, get_counters, get_stats};

fn show_stats(stats: &Stats) {
    println!("Total files: {}", stats.files_count);
    println!("Total loc: {}", stats.total_loc);
    println!("Empty loc: {}", stats.empty_loc);
}

fn show_counters(counters: &Vec<Counter>) {
    const SHOW_COUNT: usize = 10;
    let len = counters.len();
    let max = if len < SHOW_COUNT {
        len
    }
    else{
        SHOW_COUNT
    };
    if max > 0 {
        println!("{} biggest files:", max);
    }
    let mut i = 0;
    while i < max { 
        println!("{position}. {total_loc} loc in {file_name}",
                 position = (i + 1),
                 total_loc = counters[i].total_loc,
                 file_name = counters[i].file);
        i += 1;
    } 
}

fn main() {
    println!("Source lines of code program...");
    let matches = App::new("Source lines of code")
        .version("1.0")
        .author("hejack0207 <hejack0207@sina.com>")
        .about("Source lines of codes program")
        .arg(Arg::with_name("summary")
             .short("s")
             .long("summary")
             .help("Display only summary one line")
             .takes_value(false))
        .get_matches();

    let onlysummary = false; //matches.value_of("summary").unwrap_or(false);

    let mut files: Vec<String> = Vec::new();
    get_files(".", &mut files);
    let counters = get_counters(files);
    let stats = get_stats(&counters);
    
    if ! onlysummary {
        show_counters(&counters);
    }
    show_stats(&stats);
}

#[test]
fn get_files_test() {
    let mut files: Vec<String> = Vec::new();
    get_files("./test_data/", &mut files);
    assert_eq!(2, files.len());
}

#[test]
fn get_counters_test() {
    let mut files: Vec<String> = Vec::new();
    get_files("./test_data/", &mut files);
    let counters = get_counters(files);
    assert_eq!(2, counters.len());
}

#[test]
fn get_stats_test(){
    let mut files: Vec<String> = Vec::new();
    get_files("./test_data/", &mut files); 
    let counters = get_counters(files);
    let stats = get_stats(&counters);

    assert_eq!(2, stats.files_count);
    assert_eq!(10, stats.total_loc);
    assert_eq!(12, stats.empty_loc);
}