use std::ops::Range;
use gpui::{App, Global, SharedString};
use theme::HighlightKind;
pub type Highlighter = fn(language: &str, code: &str) -> Option<Vec<(Range<usize>, HighlightKind)>>;
struct Installed {
highlighter: Highlighter,
languages: Vec<SharedString>,
}
impl Global for Installed {}
pub fn set_highlighter(
cx: &mut App,
highlighter: Highlighter,
languages: impl IntoIterator<Item = impl Into<SharedString>>,
) {
cx.set_global(Installed {
highlighter,
languages: languages.into_iter().map(Into::into).collect(),
});
}
pub fn languages(cx: &App) -> &[SharedString] {
cx.try_global::<Installed>()
.map_or(&[], |installed| &installed.languages)
}
pub(crate) fn spans(
cx: &App,
language: Option<&str>,
code: &str,
) -> Option<Vec<(Range<usize>, HighlightKind)>> {
(cx.try_global::<Installed>()?.highlighter)(language?, code)
}