nargo_document/theme/
mod.rs1pub mod dark_theme;
5pub mod default_theme;
6pub mod tech_theme;
7
8pub use dark_theme::DarkTheme;
9pub use default_theme::{DefaultTheme, LocaleInfo, NavItem, PageContext, SidebarGroup, SidebarLink};
10pub use tech_theme::TechTheme;
11
12use crate::config::Config;
13use std::sync::Arc;
14
15pub trait Theme: Send + Sync {
17 fn name(&self) -> &str;
19
20 fn render_page(&self, context: &PageContext) -> Result<String, Box<dyn std::error::Error>>;
22
23 fn config(&self) -> &Config;
25
26 fn static_resources(&self) -> Vec<(String, String)> {
28 Vec::new()
29 }
30}
31
32pub struct ThemeFactory;
34
35impl ThemeFactory {
36 pub fn create(theme_name: &str, config: Config) -> Result<Arc<dyn Theme>, Box<dyn std::error::Error>> {
45 match theme_name.to_lowercase().as_str() {
46 "default" => Ok(Arc::new(DefaultTheme::new(config)?)),
47 "dark" => Ok(Arc::new(DarkTheme::new(config)?)),
48 "tech" => Ok(Arc::new(TechTheme::new(config)?)),
49 "vutex-theme-default" => Ok(Arc::new(DefaultTheme::new(config)?)),
50 _ => Err(format!("Unknown theme: {}", theme_name).into()),
51 }
52 }
53
54 pub fn available_themes() -> Vec<&'static str> {
56 vec!["default", "dark", "tech", "vutex-theme-default"]
57 }
58}