diff --git a/crates/storybook2/src/storybook2.rs b/crates/storybook2/src/storybook2.rs index 2ec3f06737b2450d8fa2d1fa19371ea7e1964e7e..3f2e80ff34394048c1621d9cc7539734adcaf1a1 100644 --- a/crates/storybook2/src/storybook2.rs +++ b/crates/storybook2/src/storybook2.rs @@ -50,14 +50,7 @@ fn main() { let story_selector = args.story.clone(); - let theme = match args.theme.as_ref().map(|theme| theme.as_str()) { - Some("Rosé Pine") => themes::rose_pine(), - Some("Rosé Pine Dawn") => themes::rose_pine_dawn(), - Some(theme_name) => { - panic!("Only 'Rosé Pine' and 'Rosé Pine Dawn' are currently supported.") - } - None => themes::rose_pine_dawn(), - }; + let theme = themes::load_theme(args.theme); let asset_source = Arc::new(Assets); gpui3::App::production(asset_source).run(move |cx| { diff --git a/crates/storybook2/src/themes.rs b/crates/storybook2/src/themes.rs index 0bba1fc19fc0a7b8c03e2ddcbc5e0e1cd9a8d599..6e06f5b6b4a75d41b369c55b1321eb2ac8ad160f 100644 --- a/crates/storybook2/src/themes.rs +++ b/crates/storybook2/src/themes.rs @@ -1,3 +1,32 @@ mod rose_pine; pub use rose_pine::*; + +use gpui3::serde_json; +use serde::Deserialize; +use ui::Theme; + +use crate::assets::Assets; + +#[derive(Deserialize)] +struct LegacyTheme { + pub base_theme: serde_json::Value, +} + +pub fn load_theme(override_theme_name: Option) -> Theme { + let theme = if let Some(theme) = override_theme_name { + let theme_contents = Assets::get(&format!("themes/{theme}.json")) + .unwrap_or_else(|| panic!("failed to load theme: {theme}.json")); + + let legacy_theme: LegacyTheme = + serde_json::from_str(std::str::from_utf8(&theme_contents.data).unwrap()).unwrap(); + + let new_theme: Theme = serde_json::from_value(legacy_theme.base_theme.clone()).unwrap(); + + new_theme + } else { + rose_pine_dawn() + }; + + theme +}