discord-css-injector/src/themes.rs

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
}