utils_tree_sitter/
lib.rs

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        // "zig" => "Zig",
19        "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 = "zig"))]
52        // "Zig" => parser.set_language(&tree_sitter_zig::language())?,
53        #[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}