daipendency_extractor/
parsing.rs

1use thiserror::Error;
2use tree_sitter::{Language, LanguageError, Parser};
3
4#[derive(Error, Debug)]
5#[error(transparent)]
6pub struct ParserError(#[from] LanguageError);
7
8pub fn get_parser(parser_language: &Language) -> Result<Parser, ParserError> {
9    let mut parser = Parser::new();
10    parser.set_language(parser_language).map_err(ParserError)?;
11    Ok(parser)
12}
13
14#[cfg(test)]
15mod tests {
16    use super::*;
17    use std::ffi::c_void;
18
19    // Minimal valid language struct matching tree-sitter's TSLanguage
20    #[repr(C)]
21    struct MinimalLanguage {
22        version: u32,
23        symbol_count: u32,
24        symbol_metadata: &'static [u32],
25        parse_actions: &'static [u16],
26        lex_modes: &'static [u32],
27        symbol_names: &'static [&'static str],
28        field_count: u32,
29        field_names: &'static [&'static str],
30        field_map_slices: &'static [u8],
31        field_map_entries: &'static [u16],
32        parse_table: &'static [u16],
33        lex_fn: Option<unsafe extern "C" fn(*mut c_void, u32, *mut c_void) -> bool>,
34    }
35
36    static MINIMAL_LANGUAGE: MinimalLanguage = MinimalLanguage {
37        version: 14, // TREE_SITTER_LANGUAGE_VERSION
38        symbol_count: 1,
39        symbol_metadata: &[0],
40        parse_actions: &[0],
41        lex_modes: &[0],
42        symbol_names: &["root"],
43        field_count: 0,
44        field_names: &[],
45        field_map_slices: &[],
46        field_map_entries: &[],
47        parse_table: &[0],
48        lex_fn: None,
49    };
50
51    #[test]
52    fn get_parser_valid() {
53        let language = unsafe { Language::from_raw(&MINIMAL_LANGUAGE as *const _ as *const _) };
54
55        let result = get_parser(&language);
56
57        assert!(result.is_ok());
58    }
59}