use {
super::{HasImportance, PropertyDeclaration},
crate::{
domain::HasPropertyDeclarations,
parsers::{
property_declaration_parser::PropertyDeclarationParser,
ParserContext,
},
CustomParseError,
},
cssparser::{DeclarationListParser, ParseError, Parser, ToCss},
std::{fmt, marker::PhantomData},
};
#[derive(Default, Debug, Clone, Ord, PartialOrd, Eq, PartialEq, Hash)]
pub struct PropertyDeclarations<I: HasImportance>(
pub Vec<PropertyDeclaration<I>>,
);
impl<I: HasImportance> ToCss for PropertyDeclarations<I> {
fn to_css<W: fmt::Write>(&self, dest: &mut W) -> fmt::Result {
let length = self.0.len();
if length != 0 {
for index in 0..(length - 1) {
(unsafe { self.0.get_unchecked(index) }).to_css(dest)?;
}
(unsafe { self.0.get_unchecked(length - 1) })
.to_css_without_trailing_semicolon(dest)
} else {
Ok(())
}
}
}
impl<I: HasImportance> HasPropertyDeclarations<I> for PropertyDeclarations<I> {
#[inline(always)]
fn property_declarations(&self) -> &PropertyDeclarations<I> {
self
}
#[inline(always)]
fn property_declarations_mut(&mut self) -> &mut PropertyDeclarations<I> {
self
}
#[inline(always)]
fn property_declarations_slice(&self) -> &[PropertyDeclaration<I>] {
&self.0[..]
}
#[inline(always)]
fn property_declarations_vec(&self) -> &Vec<PropertyDeclaration<I>> {
&self.0
}
#[inline(always)]
fn property_declarations_vec_mut(
&mut self,
) -> &mut Vec<PropertyDeclaration<I>> {
&mut self.0
}
}
impl<I: HasImportance> PropertyDeclarations<I> {
#[inline(always)]
pub fn is_empty(&self) -> bool {
self.0.is_empty()
}
pub(crate) fn parse_property_declaration_list<'i: 't, 't>(
context: &ParserContext,
input: &mut Parser<'i, 't>,
) -> Result<PropertyDeclarations<I>, ParseError<'i, CustomParseError<'i>>>
{
let mut propertyDeclarations = Vec::new();
let parsedPropertyDeclarations = DeclarationListParser::new(
input,
PropertyDeclarationParser {
context,
marker: PhantomData,
},
);
for propertyDeclaration in parsedPropertyDeclarations
{
match propertyDeclaration {
Ok(propertyDeclaration) => {
propertyDeclarations.push(propertyDeclaration)
}
Err(preciseParseError) => return Err(preciseParseError.0),
}
}
Ok(PropertyDeclarations(propertyDeclarations))
}
}