use std::collections::HashMap;
#[derive(Deserialize, PartialEq, Debug, Default)]
pub struct Style {
pub id: i32,
pub name: String,
pub description: String,
pub user: User,
pub updated: String,
pub weekly_install_count: i32,
pub total_install_count: i32,
pub rating: Option<f32>,
pub after_screenshot_name: Option<String>,
pub obsoleting_style_id: Option<i32>,
pub obsoleting_style_name: Option<String>,
pub obsolete: u8,
pub admin_delete_reason: Option<String>,
pub obsoletion_message: Option<String>,
pub screenshots: Option<Vec<String>>,
pub license: Option<String>,
pub created: String,
pub category: String,
pub subcategory: Option<String>,
pub pledgie_id: Option<i32>,
pub additional_info: Option<String>,
pub css: String,
pub discussions: Vec<Discussion>,
pub userjs_url: Option<String>,
pub style_settings: Vec<StyleSetting>,
}
#[derive(Deserialize, PartialEq, Debug, Default)]
pub struct User {
pub id: i32,
pub name: String,
pub email: Option<String>,
pub paypal_email: Option<String>,
pub homepage: Option<String>,
pub about: Option<String>,
pub license: Option<String>,
}
#[derive(Deserialize, PartialEq, Debug)]
pub struct Discussion {
pub id: i32,
pub name: String,
pub rating: i32,
pub created: String,
pub author_name: String,
pub author_id: i32,
}
#[derive(Deserialize, PartialEq, Debug, Default)]
pub struct StyleSetting {
pub id: i32,
pub style_id: i32,
pub install_key: String,
pub label: String,
pub setting_type: String,
pub style_setting_options: Vec<StyleSettingOption>,
}
#[derive(Deserialize, PartialEq, Debug, Default)]
pub struct StyleSettingOption {
pub id: i32,
pub style_setting_id: i32,
pub label: String,
pub value: String,
pub default: bool,
pub ordinal: i32,
pub install_key: String,
}
impl Style {
fn get_default_settings(&self) -> HashMap<String, String> {
let mut map = HashMap::new();
for setting in &self.style_settings {
for option in &setting.style_setting_options {
if option.default {
map.insert(setting.install_key.clone(), option.value.clone());
break;
}
}
}
map
}
pub fn get_css(&self, settings: Option<&mut HashMap<String, String>>) -> String {
let empty_map;
let settings = if let Some(map) = settings {
map
} else {
empty_map = HashMap::new();
&empty_map
};
let mut css = self.css.clone();
let defaults = self.get_default_settings();
for (key, mut val) in &defaults {
if let Some(value) = settings.get(key) {
val = value;
}
let key = ["/*[[", key, "]]*/"].concat();
css = css.replace(&key, val);
}
css
}
}