tree_sitter_wdl_1/
lib.rs

1//! This crate provides wdl language support for the [tree-sitter][] parsing library.
2use thiserror::Error;
3use tree_sitter::Language;
4
5extern "C" {
6    fn tree_sitter_wdl() -> Language;
7}
8
9/// The source of the WDL tree-sitter grammar description.
10pub const GRAMMAR: &'static str = include_str!("../../grammar.js");
11
12/// The content of the [`node-types.json`][] file for this grammar.
13///
14/// [`node-types.json`]: https://tree-sitter.github.io/tree-sitter/using-parsers#static-node-types
15pub const NODE_TYPES: &'static str = include_str!("../../src/node-types.json");
16
17/// Returns the tree-sitter [Language][] for this grammar.
18///
19/// [Language]: https://docs.rs/tree-sitter/*/tree_sitter/struct.Language.html
20pub 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
37/// Returns a `Parser` with the language set to `language()`.
38pub 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}