Thank you for posting, I’ve been eyeing using TreeSitter to make some toy languages, and this looks like a great example to learn from.
The error.rs error type definitions and the pub(crate) directives were both new to me. It’s crazy to me just how much rust continues to evolve well after the 1.0 release. Error handling in particular seems to be a point of confusion; I’ve seen (and bookmarked) many posts on HN about it. The thiserror crate was new to me, and seems really nice.