mod parser;
pub mod computed;
pub mod css_modules;
pub mod web_api;
pub use parser::*;
pub use computed::*;
pub use css_modules::*;
pub use web_api::*;
use std::collections::HashMap;
#[derive(Debug, Clone, PartialEq)]
pub struct Declaration {
pub property: String,
pub value: String,
}
#[derive(Debug, Clone)]
pub struct CssRule {
pub selectors: Vec<String>,
pub declarations: Vec<Declaration>,
}
#[derive(Debug, Clone, Default)]
pub struct StyleSheet {
pub rules: Vec<CssRule>,
}
impl StyleSheet {
pub fn parse(css: &str) -> Result<Self, String> {
parser::parse_css(css)
}
pub fn declarations_for_class(&self, class: &str) -> Vec<Declaration> {
let mut result = Vec::new();
let class_selector = format!(".{}", class);
for rule in &self.rules {
if rule.selectors.iter().any(|s| s == &class_selector || s.contains(&class_selector)) {
result.extend(rule.declarations.clone());
}
}
result
}
pub fn declarations_for_tag(&self, tag: &str) -> Vec<Declaration> {
let mut result = Vec::new();
for rule in &self.rules {
if rule.selectors.iter().any(|s| s == tag) {
result.extend(rule.declarations.clone());
}
}
result
}
pub fn compute(&self, classes: &[String], tag: &str) -> HashMap<String, String> {
let mut map = HashMap::new();
for class in classes {
for decl in self.declarations_for_class(class) {
map.insert(decl.property, decl.value);
}
}
for decl in self.declarations_for_tag(tag) {
map.entry(decl.property).or_insert(decl.value);
}
map
}
}