1use thiserror::Error;
2use tree_sitter::{LanguageError, Parser};
3
4#[derive(Error, Debug)]
5pub enum GetParserError {
6 #[error("no parser found for extension")]
7 NoParserFoundForExtension(String),
8 #[error("no parser found for extension")]
9 NoLanguageFoundForExtension(String),
10 #[error("loading grammer")]
11 LoadingGrammer(#[from] LanguageError),
12}
13
14fn get_extension_for_language(extension: &str) -> Result<String, GetParserError> {
15 Ok(match extension {
16 "py" => "Python",
17 "rs" => "Rust",
18 "sh" => "Bash",
20 "c" => "C",
21 "cpp" => "C++",
22 "cs" => "C#",
23 "css" => "CSS",
24 "ex" => "Elixir",
25 "erl" => "Erlang",
26 "go" => "Go",
27 "html" => "HTML",
28 "java" => "Java",
29 "js" => "JavaScript",
30 "json" => "JSON",
31 "hs" => "Haskell",
32 "lua" => "Lua",
33 "ml" => "OCaml",
34 _ => {
35 return Err(GetParserError::NoLanguageFoundForExtension(
36 extension.to_string(),
37 ))
38 }
39 }
40 .to_string())
41}
42
43pub fn get_parser_for_extension(extension: &str) -> Result<Parser, GetParserError> {
44 let language = get_extension_for_language(extension)?;
45 let mut parser = Parser::new();
46 match language.as_str() {
47 #[cfg(any(feature = "all", feature = "python"))]
48 "Python" => parser.set_language(&tree_sitter_python::language())?,
49 #[cfg(any(feature = "all", feature = "rust"))]
50 "Rust" => parser.set_language(&tree_sitter_rust::language())?,
51 #[cfg(any(feature = "all", feature = "bash"))]
54 "Bash" => parser.set_language(&tree_sitter_bash::language())?,
55 #[cfg(any(feature = "all", feature = "c"))]
56 "C" => parser.set_language(&tree_sitter_c::language())?,
57 #[cfg(any(feature = "all", feature = "cpp"))]
58 "C++" => parser.set_language(&tree_sitter_cpp::language())?,
59 #[cfg(any(feature = "all", feature = "csharp"))]
60 "C#" => parser.set_language(&tree_sitter_c_sharp::language())?,
61 #[cfg(any(feature = "all", feature = "css"))]
62 "CSS" => parser.set_language(&tree_sitter_css::language())?,
63 #[cfg(any(feature = "all", feature = "elixir"))]
64 "Elixir" => parser.set_language(&tree_sitter_elixir::language())?,
65 #[cfg(any(feature = "all", feature = "erlang"))]
66 "Erlang" => parser.set_language(&tree_sitter_erlang::language())?,
67 #[cfg(any(feature = "all", feature = "go"))]
68 "Go" => parser.set_language(&tree_sitter_go::language())?,
69 #[cfg(any(feature = "all", feature = "html"))]
70 "HTML" => parser.set_language(&tree_sitter_html::language())?,
71 #[cfg(any(feature = "all", feature = "java"))]
72 "Java" => parser.set_language(&tree_sitter_java::language())?,
73 #[cfg(any(feature = "all", feature = "javascript"))]
74 "JavaScript" => parser.set_language(&tree_sitter_javascript::language())?,
75 #[cfg(any(feature = "all", feature = "json"))]
76 "JSON" => parser.set_language(&tree_sitter_json::language())?,
77 #[cfg(any(feature = "all", feature = "haskell"))]
78 "Haskell" => parser.set_language(&tree_sitter_haskell::language())?,
79 #[cfg(any(feature = "all", feature = "lua"))]
80 "Lua" => parser.set_language(&tree_sitter_lua::language())?,
81 #[cfg(any(feature = "all", feature = "ocaml"))]
82 "OCaml" => parser.set_language(&tree_sitter_ocaml::language_ocaml())?,
83 _ => {
84 return Err(GetParserError::NoParserFoundForExtension(
85 language.to_string(),
86 ))
87 }
88 }
89 Ok(parser)
90}