49 lines
1.2 KiB
Rust
49 lines
1.2 KiB
Rust
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<String>,
|
|
}
|
|
|
|
pub fn read_theme_from_dir(dir: PathBuf) -> Option<Theme> {
|
|
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>(&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
|
|
}
|