Skip to main content

tree_sitter_ktav/
lib.rs

1//! Tree-sitter grammar for Ktav (כְּתָב) — the Written Configuration Format.
2//!
3//! Spec: <https://github.com/ktav-lang/spec/blob/main/versions/0.6/spec.md>
4//!
5//! # Example
6//!
7//! ```no_run
8//! let mut parser = tree_sitter::Parser::new();
9//! parser
10//!     .set_language(&tree_sitter_ktav::LANGUAGE.into())
11//!     .expect("loading Ktav grammar");
12//! let tree = parser.parse("name: Russia\n", None).unwrap();
13//! println!("{}", tree.root_node().to_sexp());
14//! ```
15
16use tree_sitter_language::LanguageFn;
17
18extern "C" {
19    fn tree_sitter_ktav() -> *const ();
20}
21
22/// The tree-sitter [`Language`][tree_sitter::Language] for the Ktav grammar.
23pub const LANGUAGE: LanguageFn = unsafe { LanguageFn::from_raw(tree_sitter_ktav) };
24
25/// The syntax-highlight query (`queries/highlights.scm`).
26pub const HIGHLIGHTS_QUERY: &str = include_str!("../../queries/highlights.scm");
27
28/// The local-variable / scope query (`queries/locals.scm`).
29pub const LOCALS_QUERY: &str = include_str!("../../queries/locals.scm");
30
31/// The injection query (`queries/injections.scm`).
32pub const INJECTIONS_QUERY: &str = include_str!("../../queries/injections.scm");
33
34/// The `node-types.json` describing every node kind in this grammar.
35pub const NODE_TYPES: &str = include_str!("../../src/node-types.json");
36
37#[cfg(test)]
38mod tests {
39    #[test]
40    fn can_load_grammar() {
41        let mut parser = tree_sitter::Parser::new();
42        parser
43            .set_language(&super::LANGUAGE.into())
44            .expect("Error loading Ktav language");
45    }
46
47    #[test]
48    fn parses_basic_document() {
49        let mut parser = tree_sitter::Parser::new();
50        parser
51            .set_language(&super::LANGUAGE.into())
52            .expect("Error loading Ktav language");
53        let tree = parser
54            .parse("name: Russia\nport: 8080\n", None)
55            .expect("parse failed");
56        let sexp = tree.root_node().to_sexp();
57        assert!(sexp.contains("object_pair"));
58        assert!(sexp.contains("integer"));
59        assert!(!tree.root_node().has_error());
60    }
61}