use std::path::PathBuf; use serde::{Deserialize, Serialize}; #[derive(Serialize, Deserialize)] pub struct Theme { pub name: String, pub description: String, #[serde(skip)] pub slug: String, #[serde(skip)] pub files: Vec, } pub fn read_theme_from_dir(dir: PathBuf) -> Option { if let Some((slug, mut theme)) = dir .file_name() .map(|dir_name| dir_name.to_string_lossy().to_string()) .and_then(|slug| { std::fs::read_to_string(dir.join("theme.json")) .map(|theme_json| (slug, theme_json)) .ok() }) .and_then(|(slug, theme_json)| { serde_json::from_str::(&theme_json) .ok() .map(|theme| (slug, theme)) }) { theme.slug = slug.clone(); let files: Vec<_> = std::fs::read_dir(dir) .unwrap() .into_iter() .filter(|r| r.is_ok()) .map(|r| r.unwrap()) .map(|e| e.file_name().to_string_lossy().to_string()) .filter(|n| n.ends_with(".css")) .collect(); theme.files = files; return Some(theme); } None }