1use thiserror::Error;
3use tree_sitter::Language;
4
5extern "C" {
6 fn tree_sitter_wdl() -> Language;
7}
8
9pub const GRAMMAR: &'static str = include_str!("../../grammar.js");
11
12pub const NODE_TYPES: &'static str = include_str!("../../src/node-types.json");
16
17pub fn language() -> Language {
21 unsafe { tree_sitter_wdl() }
22}
23
24#[cfg(feature = "json")]
25pub fn node_types() -> serde_json::Result<serde_json::Value> {
26 serde_json::from_str(NODE_TYPES)
27}
28
29#[derive(Error, Debug)]
30pub enum ParserError {
31 #[error("Error creating parser for WDL 1.x")]
32 Language { source: tree_sitter::LanguageError },
33 #[error("WDL document is empty")]
34 DocumentEmpty,
35}
36
37pub fn parser() -> Result<tree_sitter::Parser, ParserError> {
39 let mut parser = tree_sitter::Parser::new();
40 parser
41 .set_language(language())
42 .map_err(|source| ParserError::Language { source })?;
43 Ok(parser)
44}
45
46pub fn parse_document(text: &str) -> Result<tree_sitter::Tree, ParserError> {
47 let mut parser = parser()?;
48 parser
49 .parse(text, None)
50 .ok_or_else(|| ParserError::DocumentEmpty)
51}
52
53#[cfg(test)]
54mod tests {
55 #[test]
56 fn test_can_load_grammar() {
57 super::parser().expect("Error loading wdl language");
58 }
59}