daipendency_extractor/
parsing.rs1use 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 #[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, 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}