use {
super::{Document, DocumentCondition},
crate::domain::{
at_rules::VendorPrefixedAtRule,
CssRule,
CssRules,
HasCssRules,
HasVendorPrefix,
VendorPrefix,
},
cssparser::ToCss,
std::fmt,
};
#[derive(Debug, Clone)]
pub struct DocumentAtRule {
pub vendor_prefix: Option<VendorPrefix>,
pub condition: DocumentCondition,
pub rules: CssRules,
}
impl HasCssRules for DocumentAtRule {
#[inline(always)]
fn css_rules(&self) -> &CssRules {
&self.rules
}
#[inline(always)]
fn css_rules_mut(&mut self) -> &mut CssRules {
&mut self.rules
}
#[inline(always)]
fn css_rules_slice(&self) -> &[CssRule] {
&self.rules.0[..]
}
#[inline(always)]
fn css_rules_vec(&self) -> &Vec<CssRule> {
&self.rules.0
}
#[inline(always)]
fn css_rules_vec_mut(&mut self) -> &mut Vec<CssRule> {
&mut self.rules.0
}
}
impl ToCss for DocumentAtRule {
fn to_css<W: fmt::Write>(&self, dest: &mut W) -> fmt::Result {
dest.write_str("@")?;
if let Some(ref vendor_prefix) = self.vendor_prefix {
vendor_prefix.to_css(dest)?;
}
dest.write_str("document ")?;
self.condition.to_css(dest)?;
dest.write_char('{')?;
self.rules.to_css(dest)?;
dest.write_char('}')
}
}
impl HasVendorPrefix for DocumentAtRule {
#[inline(always)]
fn isNotVendorPrefixed(&self) -> bool {
self.vendor_prefix.is_none()
}
}
impl VendorPrefixedAtRule for DocumentAtRule {}
impl DocumentAtRule {
pub fn evaluate<D: Document>(&self, document: &D) -> bool {
self.condition.evaluate(document)
}
}