gitcortex_indexer/parser/
mod.rs1use std::path::Path;
2
3use gitcortex_core::{
4 error::Result,
5 graph::{Edge, Node, NodeId},
6};
7
8pub mod go;
9pub mod java;
10pub mod python;
11pub mod rust;
12pub mod typescript;
13
14pub struct ParseResult {
16 pub nodes: Vec<Node>,
17 pub edges: Vec<Edge>,
18 pub deferred_calls: Vec<(NodeId, String)>,
20 pub deferred_uses: Vec<(NodeId, String)>,
22 pub deferred_implements: Vec<(NodeId, String)>,
24 pub deferred_inherits: Vec<(NodeId, String)>,
26 pub deferred_throws: Vec<(NodeId, String)>,
28 pub deferred_annotated: Vec<(NodeId, String)>,
30 pub deferred_imports: Vec<(NodeId, String)>,
32}
33
34pub trait LanguageParser: Send + Sync {
41 fn extensions(&self) -> &[&str];
43
44 fn parse(&self, path: &Path, source: &str) -> Result<ParseResult>;
47}
48
49pub fn parser_for_path(path: &Path) -> Option<Box<dyn LanguageParser>> {
52 let ext = path.extension()?.to_str()?;
53 match ext {
54 "rs" => Some(Box::new(rust::RustParser::new())),
55 "py" => Some(Box::new(python::PythonParser::new())),
56 "ts" => Some(Box::new(typescript::TypeScriptParser::new_ts())),
57 "tsx" => Some(Box::new(typescript::TypeScriptParser::new_tsx())),
58 "js" | "mjs" | "cjs" => Some(Box::new(typescript::JavaScriptParser::new())),
59 "jsx" => Some(Box::new(typescript::JavaScriptParser::new())),
60 "go" => Some(Box::new(go::GoParser::new())),
61 "java" => Some(Box::new(java::JavaParser::new())),
62 _ => None,
63 }
64}