themes.rs

 1mod rose_pine;
 2
 3pub use rose_pine::*;
 4
 5use anyhow::{Context, Result};
 6use gpui3::serde_json;
 7use serde::Deserialize;
 8use ui::Theme;
 9
10use crate::assets::Assets;
11
12#[derive(Deserialize)]
13struct LegacyTheme {
14    pub base_theme: serde_json::Value,
15}
16
17/// Loads the [`Theme`] with the given name.
18pub fn load_theme(name: String) -> Result<Theme> {
19    let theme_contents = Assets::get(&format!("themes/{name}.json"))
20        .with_context(|| format!("theme file not found: '{name}'"))?;
21
22    let legacy_theme: LegacyTheme =
23        serde_json::from_str(std::str::from_utf8(&theme_contents.data)?)
24            .context("failed to parse legacy theme")?;
25
26    let theme: Theme = serde_json::from_value(legacy_theme.base_theme.clone())
27        .context("failed to parse `base_theme`")?;
28
29    Ok(theme)
30}