pub mod dark_theme;
pub mod default_theme;
pub mod tech_theme;
pub use dark_theme::DarkTheme;
pub use default_theme::{DefaultTheme, LocaleInfo, NavItem, PageContext, SidebarGroup, SidebarLink};
pub use tech_theme::TechTheme;
use crate::config::Config;
use std::sync::Arc;
pub trait Theme: Send + Sync {
fn name(&self) -> &str;
fn render_page(&self, context: &PageContext) -> Result<String, Box<dyn std::error::Error>>;
fn config(&self) -> &Config;
fn static_resources(&self) -> Vec<(String, String)> {
Vec::new()
}
}
pub struct ThemeFactory;
impl ThemeFactory {
pub fn create(theme_name: &str, config: Config) -> Result<Arc<dyn Theme>, Box<dyn std::error::Error>> {
match theme_name.to_lowercase().as_str() {
"default" => Ok(Arc::new(DefaultTheme::new(config)?)),
"dark" => Ok(Arc::new(DarkTheme::new(config)?)),
"tech" => Ok(Arc::new(TechTheme::new(config)?)),
"vutex-theme-default" => Ok(Arc::new(DefaultTheme::new(config)?)),
_ => Err(format!("Unknown theme: {}", theme_name).into()),
}
}
pub fn available_themes() -> Vec<&'static str> {
vec!["default", "dark", "tech", "vutex-theme-default"]
}
}