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
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::php;
use language::python;
use language::ruby;
use language::rust;
use language::scala;
use language::FileTypes;
use language::FindResult;
use language::Language;
use std::io::Error;
use std::io::ErrorKind;
use std::path::Path;

pub mod language;
pub mod utils;

pub fn run(paths: Vec<&Path>) -> Vec<Result<FindResult, Error>> {
    paths
        .into_iter()
        .map(|path| resolve_type_and_run(path))
        .collect::<Vec<Result<FindResult, Error>>>()
}

pub fn resolve_type_and_run(p: &Path) -> Result<FindResult, Error> {
    let unsupported_err = Err(Error::new(
        ErrorKind::NotFound,
        "Unsupported file extension",
    ));
    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(FileTypes::C, p)?),
                "cpp" => Ok(run_source(FileTypes::Cpp, p)?),
                "cs" => Ok(run_source(FileTypes::CSharp, p)?),
                "css" => Ok(run_source(FileTypes::CSS, p)?),
                "go" => Ok(run_source(FileTypes::Go, p)?),
                "html" => Ok(run_source(FileTypes::HTML, p)?),
                "java" => Ok(run_source(FileTypes::Java, p)?),
                "js" => Ok(run_source(FileTypes::JavaScript, p)?),
                "php" => Ok(run_source(FileTypes::PHP, p)?),
                "py" => Ok(run_source(FileTypes::Python, p)?),
                "rb" => Ok(run_source(FileTypes::Ruby, p)?),
                "rs" => Ok(run_source(FileTypes::Rust, p)?),
                "sc" => Ok(run_source(FileTypes::Scala, p)?),
                "scala" => Ok(run_source(FileTypes::Scala, p)?),
                "sh" => Ok(run_source(FileTypes::Bash, p)?),
                _ => unsupported_err,
            },
        },
    }
}

fn run_source(file_type: FileTypes, p: &Path) -> Result<FindResult, Error> {
    match file_type {
        FileTypes::Bash => bash::source(p).find(),
        FileTypes::C => c::source(p).find(),
        FileTypes::CSS => css::source(p).find(),
        FileTypes::CSharp => csharp::source(p).find(),
        FileTypes::Cpp => cpp::source(p).find(),
        FileTypes::Go => golang::source(p).find(),
        FileTypes::HTML => html::source(p).find(),
        FileTypes::Java => java::source(p).find(),
        FileTypes::JavaScript => javascript::source(p).find(),
        FileTypes::PHP => php::source(p).find(),
        FileTypes::Python => python::source(p).find(),
        FileTypes::Ruby => ruby::source(p).find(),
        FileTypes::Rust => rust::source(p).find(),
        FileTypes::Scala => scala::source(p).find(),
    }
}