use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PackManifest {
pub pack: PackMeta,
#[serde(default)]
pub compatibility: CompatibilityInfo,
#[serde(default)]
pub templates: HashMap<String, TemplateEntry>,
#[serde(default)]
pub themes: HashMap<String, ThemeEntry>,
#[serde(default)]
pub components: HashMap<String, ComponentEntry>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PackMeta {
pub name: String,
pub version: String,
#[serde(default)]
pub description: Option<String>,
#[serde(default)]
pub authors: Vec<String>,
#[serde(default)]
pub capabilities: Vec<String>,
#[serde(default)]
pub license: Option<String>,
#[serde(default)]
pub repository: Option<String>,
#[serde(default)]
pub keywords: Vec<String>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct CompatibilityInfo {
#[serde(default)]
pub min_engine_version: Option<String>,
#[serde(default)]
pub max_engine_version: Option<String>,
#[serde(default)]
pub typst_version: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TemplateEntry {
pub file: String,
#[serde(default)]
pub description: Option<String>,
#[serde(default)]
pub default_theme: Option<String>,
#[serde(default)]
pub schema: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ThemeEntry {
pub file: String,
#[serde(default)]
pub description: Option<String>,
#[serde(default)]
pub default: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ComponentEntry {
pub file: String,
#[serde(default)]
pub description: Option<String>,
#[serde(default)]
pub overrides: Option<String>,
}
impl PackManifest {
pub fn from_toml(toml_str: &str) -> Result<Self, toml::de::Error> {
toml::from_str(toml_str)
}
pub fn to_toml(&self) -> Result<String, toml::ser::Error> {
toml::to_string_pretty(self)
}
pub fn default_theme_name(&self) -> Option<&str> {
self.themes
.iter()
.find(|(_, entry)| entry.default)
.map(|(name, _)| name.as_str())
}
}
impl Default for PackManifest {
fn default() -> Self {
Self {
pack: PackMeta {
name: "unnamed".into(),
version: "0.1.0".into(),
description: None,
authors: vec![],
capabilities: vec![],
license: None,
repository: None,
keywords: vec![],
},
compatibility: CompatibilityInfo::default(),
templates: HashMap::new(),
themes: HashMap::new(),
components: HashMap::new(),
}
}
}