use std::{borrow::Cow, path::Path};
pub use syntastica_highlight::HighlightConfiguration;
pub use tft::FileType;
pub use crate::ts_runtime::Language;
mod union;
pub use union::*;
pub trait SupportedLanguage<'set, S>: Sized {
fn name(&self) -> Cow<'_, str>;
fn for_name(name: impl AsRef<str>, set: &'set S) -> Result<Self, crate::Error>;
fn for_file_type(file_type: FileType, set: &'set S) -> Option<Self>;
fn for_injection(name: impl AsRef<str>, set: &'set S) -> Option<Self> {
let name = name.as_ref();
tft::try_detect(Path::new(name), "")
.or_else(|| tft::try_detect(Path::new(&format!("file.{name}")), ""))
.and_then(|ft| Self::for_file_type(ft, set))
}
}
pub trait LanguageSet<'s>: Sized {
type Language: SupportedLanguage<'s, Self>;
fn get_language(
&self,
language: Self::Language,
) -> Result<&HighlightConfiguration, crate::Error>;
}