use std::path::Path;
use gitcortex_core::{
error::Result,
graph::{Edge, Node, NodeId},
};
mod complexity;
mod deftext;
pub mod go;
pub mod java;
pub mod markdown;
pub mod python;
pub mod rust;
pub mod typescript;
pub(crate) use complexity::cyclomatic_complexity;
pub(crate) use deftext::capture as capture_definition;
pub struct ParseResult {
pub nodes: Vec<Node>,
pub edges: Vec<Edge>,
pub deferred_calls: Vec<(NodeId, String, u32)>,
pub deferred_uses: Vec<(NodeId, String)>,
pub deferred_implements: Vec<(NodeId, String)>,
pub deferred_inherits: Vec<(NodeId, String)>,
pub deferred_throws: Vec<(NodeId, String)>,
pub deferred_annotated: Vec<(NodeId, String)>,
pub deferred_imports: Vec<(NodeId, String)>,
pub deferred_doc_refs: 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())),
"java" => Some(Box::new(java::JavaParser::new())),
"md" | "markdown" => Some(Box::new(markdown::MarkdownParser::new())),
_ => None,
}
}