mod loader;
mod manifest;
pub use loader::PackLoader;
pub use manifest::PackManifest;
use crate::theme::Theme;
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use std::path::PathBuf;
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub struct PackId(pub String);
impl PackId {
pub fn new(id: impl Into<String>) -> Self {
Self(id.into())
}
}
impl std::fmt::Display for PackId {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", self.0)
}
}
impl From<&str> for PackId {
fn from(s: &str) -> Self {
Self(s.to_string())
}
}
#[derive(Debug, Clone)]
pub struct Pack {
pub id: PackId,
pub manifest: PackManifest,
pub root_path: Option<PathBuf>,
pub default_theme: Option<Theme>,
pub themes: HashMap<String, Theme>,
pub templates: HashMap<String, String>,
pub components: HashMap<String, String>,
pub assets: HashMap<String, Vec<u8>>,
}
impl Pack {
pub fn new(id: impl Into<String>, manifest: PackManifest) -> Self {
Self {
id: PackId::new(id),
manifest,
root_path: None,
default_theme: None,
themes: HashMap::new(),
templates: HashMap::new(),
components: HashMap::new(),
assets: HashMap::new(),
}
}
pub fn get_template(&self, name: &str) -> Option<&String> {
self.templates.get(name)
}
pub fn get_component(&self, name: &str) -> Option<&String> {
self.components.get(name)
}
pub fn get_theme(&self, name: &str) -> Option<&Theme> {
self.themes.get(name)
}
pub fn get_asset(&self, name: &str) -> Option<&Vec<u8>> {
self.assets.get(name)
}
pub fn list_templates(&self) -> Vec<&String> {
self.templates.keys().collect()
}
pub fn list_themes(&self) -> Vec<&String> {
self.themes.keys().collect()
}
}