summaryrefslogtreecommitdiff
path: root/src/main.rs
blob: 57a81967615a7f716e3fcfeb7d40bb53d900fe58 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
use std::fs::File;
use std::env;
use std::path::Path;
use std::io::*;

mod config;

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());
	let end_comment_section = s.starts_with(comment_tokens.end_comment_block.as_str());

	if begin_comment_section {
		*in_comment_section = true;
		return true;
	}
	else if *in_comment_section && !end_comment_section {
		return true;
	}
	else if *in_comment_section && end_comment_section {
		*in_comment_section = false;
		return true;
	}

	s.starts_with(comment_tokens.single_line.as_str()) || s.is_empty()
}

fn get_config<'a>(config: &'a Vec<config::CommentTokens>, extension: &str) -> Option<&'a config::CommentTokens> {
	for conf in config.iter() {
		if conf.file_ending == extension {
			return Some(conf);
		}
	}
	None
}

fn count_lines(filename: &str, config: &mut Vec<config::CommentTokens>) -> Result<i32>{
	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")),
	};

	let comment_tokens = match get_config(&config, extension) {
		Some(conf) => conf,
		None => return Err(Error::new(std::io::ErrorKind::NotFound, "config not found")),
	};

	let bufread = BufReader::new(try!(File::open(filename)));
	for line in bufread.lines() {
		if omit_line(try!(line), &mut in_comment_section, &comment_tokens) {
			continue;
		}
		sum += 1;
	}
	Ok(sum)
}

fn main() {
	let mut config = match config::read_config() {
		Err(e) => panic!("error reading config file(s): {}", e),
		Ok(i) => i,
	};

	let mut sum = 0;

	// TODO read files from standard input option
	// TODO read all file below this dictionary
	for argument in env::args().skip(1) {
		match count_lines(argument.as_str(), &mut config) {
			Ok(i) => {
				println!("{}\t: {}", i, argument);
				sum += i; },
			Err(e) => println!("error for file {}: {}", argument, e),
		}
	}
	println!("{}\t: total", sum);
}