fluidattacks_blends/
parse.rs1use tree_sitter::{Parser, Tree};
4
5use crate::content::Content;
6use crate::language::LanguageExt;
7
8#[derive(Clone, Copy, PartialEq, Eq, Debug)]
9pub struct ParseError;
10
11pub fn parse(content: &Content) -> Result<Tree, ParseError> {
12 let mut parser = Parser::new();
13 parser
14 .set_language(&content.language.tree_sitter())
15 .map_err(|_| ParseError)?;
16
17 let tree = parser.parse(&content.bytes, None).ok_or(ParseError)?;
18 if tree.root_node().has_error() {
19 return Err(ParseError);
20 }
21
22 Ok(tree)
23}
24
25#[cfg(test)]
26mod tests {
27 use super::parse;
28 use crate::content::Content;
29 use std::fs;
30
31 fn file_content(source: &[u8]) -> Content {
32 let dir = tempfile::tempdir().unwrap();
33 let path = dir.path().join("snippet.java");
34 fs::write(&path, source).unwrap();
35 Content::from_path(&path, None).unwrap()
36 }
37
38 #[test]
39 fn parses_valid_file() {
40 assert!(parse(&file_content(b"class A {}")).is_ok());
41 }
42
43 #[test]
44 fn rejects_malformed_file() {
45 assert!(parse(&file_content(b"class A {")).is_err());
46 }
47}