File size: 1,266 Bytes
f14b4e9 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | use std::path::PathBuf;
use tree_sitter::{Language, Parser};
use super::LanguageError;
use super::ParsedSource;
/// Gets the tree-sitter language for Firm DSL.
fn language() -> Language {
tree_sitter_firm::LANGUAGE.into()
}
/// Parses Firm DSL source code into a structured representation.
///
/// This is the main entry point for parsing Firm DSL. It initializes
/// a tree-sitter parser and returns ParsedSource for further processing.
pub fn parse_source(source: String, path: Option<PathBuf>) -> Result<ParsedSource, LanguageError> {
let mut parser = Parser::new();
parser
.set_language(&language())
.map_err(|_| LanguageError::IncompatibleLanguageVersion)?;
match parser.parse(&source, None) {
Some(tree) => Ok(ParsedSource::new(source, tree, path.unwrap_or_default())),
None => Err(LanguageError::LanguageNotInitialized),
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_language_valid() {
let source = r#"
contact john_doe {
name = "John Doe"
email = "john@example.com"
age = 42
}
"#;
let result = parse_source(String::from(source), None);
assert!(result.is_ok());
}
}
|