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 python;
10pub mod rust;
11pub mod typescript;
12
13pub struct ParseResult {
15 pub nodes: Vec<Node>,
16 pub edges: Vec<Edge>,
17 pub deferred_calls: Vec<(NodeId, String)>,
19 pub deferred_uses: Vec<(NodeId, String)>,
21 pub deferred_implements: Vec<(NodeId, String)>,
23 pub deferred_imports: Vec<(NodeId, String)>,
25}
26
27pub trait LanguageParser: Send + Sync {
34 fn extensions(&self) -> &[&str];
36
37 fn parse(&self, path: &Path, source: &str) -> Result<ParseResult>;
40}
41
42pub fn parser_for_path(path: &Path) -> Option<Box<dyn LanguageParser>> {
45 let ext = path.extension()?.to_str()?;
46 match ext {
47 "rs" => Some(Box::new(rust::RustParser::new())),
48 "py" => Some(Box::new(python::PythonParser::new())),
49 "ts" => Some(Box::new(typescript::TypeScriptParser::new_ts())),
50 "tsx" => Some(Box::new(typescript::TypeScriptParser::new_tsx())),
51 "js" | "mjs" | "cjs" => Some(Box::new(typescript::JavaScriptParser::new())),
52 "jsx" => Some(Box::new(typescript::JavaScriptParser::new())),
53 "go" => Some(Box::new(go::GoParser::new())),
54 _ => None,
55 }
56}