use {
super::{Keyframe, KeyframeSelector, KeyframesName},
crate::domain::{
at_rules::VendorPrefixedAtRule,
HasVendorPrefix,
VendorPrefix,
},
cssparser::ToCss,
std::fmt,
};
#[derive(Debug, Clone)]
pub struct KeyframesAtRule {
pub vendor_prefix: Option<VendorPrefix>,
pub name: KeyframesName,
pub keyframes: Vec<Keyframe>,
}
impl ToCss for KeyframesAtRule {
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("keyframes ")?;
self.name.to_css(dest)?;
dest.write_char('{')?;
for keyframe in self.keyframes.iter() {
keyframe.to_css(dest)?;
}
dest.write_char('}')
}
}
impl HasVendorPrefix for KeyframesAtRule {
#[inline(always)]
fn isNotVendorPrefixed(&self) -> bool {
self.vendor_prefix.is_none()
}
}
impl VendorPrefixedAtRule for KeyframesAtRule {}
impl KeyframesAtRule {
pub fn find_rule(&self, selector: KeyframeSelector) -> Option<usize> {
for (index, keyframe) in self.keyframes.iter().enumerate().rev() {
if keyframe.selector == selector {
return Some(index);
}
}
None
}
}