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 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113
extern crate console; use language::bash; use language::c; use language::cpp; use language::csharp; use language::css; use language::golang; use language::html; use language::java; use language::javascript; use language::lua; use language::php; use language::python; use language::ruby; use language::rust; use language::scala; use language::FileType; use language::FindResult; use language::Language; use std::io::Error; use std::io::ErrorKind; use std::path::Path; use utils::comments::noop_find_result; use utils::path::extension; pub mod language; pub mod printer; pub mod utils; pub struct OptionsCli { pub extension: Option<String>, } pub fn run(paths: Vec<&Path>, opts: OptionsCli) -> Vec<Result<FindResult, Error>> { paths .into_iter() .map(|path| resolve_type_and_run(path, &opts)) .collect::<Vec<Result<FindResult, Error>>>() } pub fn resolve_type_and_run(p: &Path, opts: &OptionsCli) -> Result<FindResult, Error> { let unsupported_err = Err(Error::new( ErrorKind::NotFound, "Unsupported file extension", )); if exclude_file(p, opts) { return Ok(noop_find_result()); } match p.extension() { None => unsupported_err, Some(_ext) => match _ext.to_str() { None => panic!("Could not convert OsStr -> str"), Some(extension) => match extension { "c" => Ok(run_source(FileType::C, p)?), "cpp" => Ok(run_source(FileType::Cpp, p)?), "cs" => Ok(run_source(FileType::CSharp, p)?), "css" => Ok(run_source(FileType::CSS, p)?), "go" => Ok(run_source(FileType::Go, p)?), "html" => Ok(run_source(FileType::HTML, p)?), "java" => Ok(run_source(FileType::Java, p)?), "js" => Ok(run_source(FileType::JavaScript, p)?), "lua" => Ok(run_source(FileType::Lua, p)?), "php" => Ok(run_source(FileType::PHP, p)?), "py" => Ok(run_source(FileType::Python, p)?), "rb" => Ok(run_source(FileType::Ruby, p)?), "rs" => Ok(run_source(FileType::Rust, p)?), "sc" => Ok(run_source(FileType::Scala, p)?), "scala" => Ok(run_source(FileType::Scala, p)?), "sh" => Ok(run_source(FileType::Bash, p)?), _ => unsupported_err, }, }, } } fn run_source(file_type: FileType, p: &Path) -> Result<FindResult, Error> { match file_type { FileType::Bash => bash::source(p).find(), FileType::C => c::source(p).find(), FileType::CSS => css::source(p).find(), FileType::CSharp => csharp::source(p).find(), FileType::Cpp => cpp::source(p).find(), FileType::Go => golang::source(p).find(), FileType::HTML => html::source(p).find(), FileType::Java => java::source(p).find(), FileType::JavaScript => javascript::source(p).find(), FileType::Lua => lua::source(p).find(), FileType::PHP => php::source(p).find(), FileType::Python => python::source(p).find(), FileType::Ruby => ruby::source(p).find(), FileType::Rust => rust::source(p).find(), FileType::Scala => scala::source(p).find(), } } fn exclude_file(p: &Path, opts: &OptionsCli) -> bool { match &opts.extension { None => false, Some(ext_options) => match extension(p) { Ok(ext_file) => { if ext_options == &ext_file { false } else { true } } Err(e) => panic!("{:?}", e), }, } }