use super::StyleRule;
use crate::{
parser::StyleSheetParser,
property::PropertyValues,
selector::Selector,
};
use bevy::{
log::trace,
prelude::*,
reflect::{TypePath},
utils::AHasher,
};
use smallvec::SmallVec;
use std::hash::{Hash, Hasher};
#[derive(Debug)]
#[derive(Asset, TypePath)]
pub struct StyleSheetAsset
{
path: String,
hash: u64,
rules: SmallVec<[StyleRule; 8]>,
}
impl StyleSheetAsset
{
pub fn parse(
path: &str,
content: &str
) -> Self {
trace!("StyleSheetAsset::parse");
let mut hasher = AHasher::default();
content.hash(&mut hasher);
let hash = hasher.finish();
Self{
path: path.to_string(),
hash,
rules: StyleSheetParser::parse(content),
}
}
pub fn get_property_names(
&self,
selector: &Selector
) -> Option<Vec<String>> {
self.rules.iter()
.find(|&rule| rule.selector == *selector)
.map(|rule| rule.properties.iter()
.map(|(prop, _val)| prop.clone())
.collect::<Vec<String>>()
)
}
pub fn get_property_value(
&self,
selector: &Selector,
name: &str
) -> Option<&PropertyValues> {
self.rules.iter()
.find(|&rule| &rule.selector == selector)
.and_then(|rule| rule.properties.get(name))
}
pub fn iter(
&self
) -> impl Iterator<Item = &StyleRule> {
self.rules.iter()
}
pub fn hash(
&self
) -> u64 {
self.hash
}
pub fn path(
&self
) -> &str {
&self.path
}
}