pub mod dart;
pub mod go;
pub mod java;
pub mod javascript;
mod js_shared;
pub mod markdown;
pub mod php;
pub mod python;
pub(crate) mod queries;
pub mod ruby;
pub mod rust_lang;
pub mod typescript;
use anyhow::Result;
use cartog_core::{Edge, Symbol};
use tree_sitter::Node;
#[derive(Debug, Clone, Default)]
pub struct ExtractionResult {
pub symbols: Vec<Symbol>,
pub edges: Vec<Edge>,
}
pub trait Extractor: Send {
fn extract(&mut self, source: &str, file_path: &str) -> Result<ExtractionResult>;
}
pub(crate) fn node_text<'a>(node: Node, source: &'a str) -> &'a str {
source.get(node.start_byte()..node.end_byte()).unwrap_or("")
}
pub(crate) fn last_segment<'a>(s: &'a str, sep: &str) -> &'a str {
s.rsplit(sep).next().unwrap_or(s)
}
#[derive(Clone, Copy, Default)]
pub(crate) struct ParentScope<'a> {
pub id: Option<&'a str>,
pub qname: Option<&'a str>,
}
impl<'a> ParentScope<'a> {
pub fn top_level(namespace: Option<&'a str>) -> Self {
Self {
id: None,
qname: namespace,
}
}
pub fn nested(id: &'a str, qname: &'a str) -> Self {
Self {
id: Some(id),
qname: Some(qname),
}
}
}
pub use cartog_core::detect_language;
pub fn get_extractor(language: &str) -> Option<Box<dyn Extractor>> {
match language {
"python" => Some(Box::new(python::PythonExtractor::new())),
"typescript" => Some(Box::new(typescript::TypeScriptExtractor::new())),
"tsx" => Some(Box::new(typescript::TsxExtractor::new())),
"javascript" => Some(Box::new(javascript::JavaScriptExtractor::new())),
"rust" => Some(Box::new(rust_lang::RustExtractor::new())),
"go" => Some(Box::new(go::GoExtractor::new())),
"ruby" => Some(Box::new(ruby::RubyExtractor::new())),
"java" => Some(Box::new(java::JavaExtractor::new())),
"php" => Some(Box::new(php::PhpExtractor::new())),
"dart" => Some(Box::new(dart::DartExtractor::new())),
"markdown" => Some(Box::new(markdown::MarkdownExtractor::new())),
_ => None,
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_get_extractor() {
assert!(get_extractor("python").is_some());
assert!(get_extractor("typescript").is_some());
assert!(get_extractor("tsx").is_some());
assert!(get_extractor("javascript").is_some());
assert!(get_extractor("rust").is_some());
assert!(get_extractor("go").is_some());
assert!(get_extractor("ruby").is_some());
assert!(get_extractor("java").is_some());
assert!(get_extractor("php").is_some());
assert!(get_extractor("dart").is_some());
assert!(get_extractor("markdown").is_some());
assert!(get_extractor("unknown").is_none());
}
}