33 lines
937 B
Rust
33 lines
937 B
Rust
use std::{collections::HashMap, sync::Mutex};
|
|
|
|
use once_cell::sync::Lazy;
|
|
use tree_sitter::QueryError;
|
|
use tree_sitter_highlight::HighlightConfiguration;
|
|
|
|
pub type HighlightConfigFactory = fn() -> Result<HighlightConfiguration, QueryError>;
|
|
|
|
static LANGUAGES: Lazy<Mutex<HashMap<String, HighlightConfigFactory>>> =
|
|
Lazy::new(|| Mutex::new(HashMap::new()));
|
|
|
|
#[cfg(feature = "built-in")]
|
|
pub mod built_in;
|
|
|
|
pub fn register_language(lang: impl Into<String>, factory: HighlightConfigFactory) {
|
|
let mut languages = LANGUAGES.lock().unwrap();
|
|
languages.insert(lang.into(), factory);
|
|
}
|
|
|
|
pub fn get_highlight_config(
|
|
lang: &str,
|
|
highlight_names: &[&str],
|
|
) -> Option<HighlightConfiguration> {
|
|
let languages = LANGUAGES.lock().unwrap();
|
|
languages
|
|
.get(lang)
|
|
.and_then(|factory| factory().ok())
|
|
.map(|mut config| {
|
|
config.configure(highlight_names);
|
|
config
|
|
})
|
|
}
|