mod generated {
include!(concat!(env!("OUT_DIR"), "/generated.rs"));
}
use generated::{RawLanguage, RAW_LANGUAGES};
pub use tree_sitter;
#[cfg(feature = "highlight")]
pub use tree_sitter_highlight;
use tree_sitter::Language;
#[derive(Clone, Copy)]
pub struct LanguageEntry {
raw: &'static RawLanguage,
}
impl LanguageEntry {
pub fn name(&self) -> &'static str {
self.raw.name
}
pub fn extensions(&self) -> &'static [&'static str] {
self.raw.extensions
}
pub fn language(&self) -> Language {
self.raw.language.into()
}
pub fn highlights_query(&self) -> &'static str {
self.raw.highlights
}
pub fn injections_query(&self) -> &'static str {
self.raw.injections
}
pub fn locals_query(&self) -> &'static str {
self.raw.locals
}
#[cfg(feature = "highlight")]
pub fn highlight_config(
&self,
recognized_names: &[String],
) -> Result<tree_sitter_highlight::HighlightConfiguration, tree_sitter::QueryError> {
let mut config = tree_sitter_highlight::HighlightConfiguration::new(
self.language(),
self.name(),
self.highlights_query(),
self.injections_query(),
self.locals_query(),
)?;
config.configure(recognized_names);
Ok(config)
}
}
pub fn languages() -> impl Iterator<Item = LanguageEntry> {
RAW_LANGUAGES.iter().map(|raw| LanguageEntry { raw })
}
pub fn count() -> usize {
RAW_LANGUAGES.len()
}
pub fn get(name: &str) -> Option<LanguageEntry> {
RAW_LANGUAGES
.iter()
.find(|raw| raw.name == name)
.map(|raw| LanguageEntry { raw })
}
pub fn from_extension(ext: &str) -> Option<LanguageEntry> {
let ext = ext.trim_start_matches('.');
RAW_LANGUAGES
.iter()
.find(|raw| raw.extensions.iter().any(|e| e.eq_ignore_ascii_case(ext)))
.map(|raw| LanguageEntry { raw })
}
pub fn from_path(path: impl AsRef<std::path::Path>) -> Option<LanguageEntry> {
path.as_ref()
.extension()
.and_then(|e| e.to_str())
.and_then(from_extension)
}