use std::path::Path;
use gitcortex_core::{
error::Result,
graph::{Edge, Node, NodeId},
};
pub mod go;
pub mod python;
pub mod rust;
pub mod typescript;
pub struct ParseResult {
pub nodes: Vec<Node>,
pub edges: Vec<Edge>,
pub deferred_calls: Vec<(NodeId, String)>,
pub deferred_uses: Vec<(NodeId, String)>,
pub deferred_implements: Vec<(NodeId, String)>,
pub deferred_imports: Vec<(NodeId, String)>,
}
pub trait LanguageParser: Send + Sync {
fn extensions(&self) -> &[&str];
fn parse(&self, path: &Path, source: &str) -> Result<ParseResult>;
}
pub fn parser_for_path(path: &Path) -> Option<Box<dyn LanguageParser>> {
let ext = path.extension()?.to_str()?;
match ext {
"rs" => Some(Box::new(rust::RustParser::new())),
"py" => Some(Box::new(python::PythonParser::new())),
"ts" => Some(Box::new(typescript::TypeScriptParser::new_ts())),
"tsx" => Some(Box::new(typescript::TypeScriptParser::new_tsx())),
"js" | "mjs" | "cjs" => Some(Box::new(typescript::JavaScriptParser::new())),
"jsx" => Some(Box::new(typescript::JavaScriptParser::new())),
"go" => Some(Box::new(go::GoParser::new())),
_ => None,
}
}