strop-syntax 0.3.0

strop syntax: statically-linked tree-sitter highlighting, curated language registry
Documentation
use streaming_iterator::StreamingIterator;
use tree_sitter::QueryCursor;

fn probe(name: &str, lang: tree_sitter::Language, query_src: &str, src: &str) {
    let mut p = tree_sitter::Parser::new();
    p.set_language(&lang).unwrap();
    let tree = p.parse(src, None).unwrap();
    println!(
        "{name} sexp: {}",
        tree.root_node()
            .to_sexp()
            .chars()
            .take(120)
            .collect::<String>()
    );
    let q = tree_sitter::Query::new(&lang, query_src).unwrap();
    let mut c = QueryCursor::new();
    let mut m = c.matches(&q, tree.root_node(), src.as_bytes());
    let mut n = 0;
    while let Some(m_) = m.next() {
        for cap in m_.captures {
            println!(
                "  {name} cap: {} @ {:?}",
                q.capture_names()[cap.index as usize],
                &src[cap.node.start_byte()..cap.node.end_byte()]
            );
        }
        n += 1;
        if n > 5 {
            break;
        }
    }
    println!("{name} matches: {n}");
}

fn main() {
    probe(
        "cpp",
        tree_sitter_cpp::LANGUAGE.into(),
        tree_sitter_cpp::HIGHLIGHT_QUERY,
        "#include <vector>\nstruct Edge { int sharp; };\n",
    );
    probe(
        "ts",
        tree_sitter_typescript::LANGUAGE_TYPESCRIPT.into(),
        tree_sitter_typescript::HIGHLIGHTS_QUERY,
        "const x: number = 1;\n",
    );
}