language.rs

 1pub use language::*;
 2use rust_embed::RustEmbed;
 3use std::borrow::Cow;
 4use std::{str, sync::Arc};
 5
 6#[derive(RustEmbed)]
 7#[folder = "languages"]
 8struct LanguageDir;
 9
10pub fn build_language_registry() -> LanguageRegistry {
11    let mut languages = LanguageRegistry::default();
12    languages.add(Arc::new(rust()));
13    languages.add(Arc::new(markdown()));
14    languages
15}
16
17fn rust() -> Language {
18    let grammar = tree_sitter_rust::language();
19    let config = toml::from_slice(&LanguageDir::get("rust/config.toml").unwrap().data).unwrap();
20    Language::new(config, Some(grammar))
21        .with_highlights_query(load_query("rust/highlights.scm").as_ref())
22        .unwrap()
23        .with_brackets_query(load_query("rust/brackets.scm").as_ref())
24        .unwrap()
25        .with_indents_query(load_query("rust/indents.scm").as_ref())
26        .unwrap()
27}
28
29fn markdown() -> Language {
30    let grammar = tree_sitter_markdown::language();
31    let config = toml::from_slice(&LanguageDir::get("markdown/config.toml").unwrap().data).unwrap();
32    Language::new(config, Some(grammar))
33        .with_highlights_query(load_query("markdown/highlights.scm").as_ref())
34        .unwrap()
35}
36
37fn load_query(path: &str) -> Cow<'static, str> {
38    match LanguageDir::get(path).unwrap().data {
39        Cow::Borrowed(s) => Cow::Borrowed(str::from_utf8(s).unwrap()),
40        Cow::Owned(s) => Cow::Owned(String::from_utf8(s).unwrap()),
41    }
42}