use crate::styles::ThemeType;
use syntect::highlighting::{Theme, ThemeSet};
#[must_use]
pub fn get_syntax_theme(theme_set: &ThemeSet, theme_type: ThemeType) -> &Theme {
let preferred_names = match theme_type {
ThemeType::Light
| ThemeType::SolarizedLight
| ThemeType::GruvboxLight
| ThemeType::CatppuccinLatte
| ThemeType::TokyoNightLight => {
vec!["base16-ocean.light", "Solarized (light)", "GitHub"]
}
ThemeType::SolarizedDark => vec!["Solarized (dark)", "base16-ocean.dark"],
ThemeType::GruvboxDark => vec!["base16-eighties.dark", "base16-ocean.dark"],
ThemeType::CatppuccinMocha => vec!["base16-mocha.dark", "base16-ocean.dark"],
ThemeType::TokyoNightDark => vec!["base16-ocean.dark", "base16-eighties.dark"],
ThemeType::Dark | ThemeType::NoColor | ThemeType::Midnight => vec![
"base16-ocean.dark",
"base16-eighties.dark",
"base16-mocha.dark",
"InspiredGitHub",
],
};
for name in &preferred_names {
if let Some(theme) = theme_set.themes.get(*name) {
return theme;
}
}
theme_set
.themes
.values()
.next()
.expect("No syntect themes available")
}
#[must_use]
pub fn get_current_syntax_theme(theme_set: &ThemeSet) -> &Theme {
use crate::styles::theme as ui_theme;
let theme_type = ui_theme().theme_type;
get_syntax_theme(theme_set, theme_type)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_get_syntax_theme_dark() {
let theme_set = ThemeSet::load_defaults();
let theme = get_syntax_theme(&theme_set, ThemeType::Dark);
assert!(!theme
.name
.as_ref()
.is_none_or(std::string::String::is_empty));
}
#[test]
fn test_get_syntax_theme_light() {
let theme_set = ThemeSet::load_defaults();
let theme = get_syntax_theme(&theme_set, ThemeType::Light);
assert!(!theme
.name
.as_ref()
.is_none_or(std::string::String::is_empty));
}
#[test]
fn test_get_syntax_theme_nocolor() {
let theme_set = ThemeSet::load_defaults();
let theme = get_syntax_theme(&theme_set, ThemeType::NoColor);
assert!(!theme
.name
.as_ref()
.is_none_or(std::string::String::is_empty));
}
#[test]
fn test_get_syntax_theme_solarized() {
let theme_set = ThemeSet::load_defaults();
let theme_dark = get_syntax_theme(&theme_set, ThemeType::SolarizedDark);
assert!(!theme_dark
.name
.as_ref()
.is_none_or(std::string::String::is_empty));
let theme_light = get_syntax_theme(&theme_set, ThemeType::SolarizedLight);
assert!(!theme_light
.name
.as_ref()
.is_none_or(std::string::String::is_empty));
}
}