#[derive(Debug, Clone)]
pub struct MediaList
{
pub media_queries: Vec<MediaQuery>,
}
impl ToCss for MediaList
{
fn to_css<W: fmt::Write>(&self, dest: &mut W) -> fmt::Result
{
if self.media_queries.is_empty()
{
return Ok(())
}
let mut iterator = self.media_queries.iter();
iterator.next().unwrap().to_css(dest)?;
for mediaQuery in iterator
{
dest.write_char(',')?;
mediaQuery.to_css(dest)?;
}
Ok(())
}
}
impl MediaList
{
pub fn is_not_empty(&self) -> bool
{
!self.media_queries.is_empty()
}
pub fn empty() -> Self
{
Self
{
media_queries: vec![]
}
}
pub(crate) fn parse_media_query_list<'i: 't, 't>(context: &ParserContext, input: &mut Parser<'i, 't>, allowInvalidMediaQueries: bool) -> Result<MediaList, ParseError<'i, CustomParseError<'i>>>
{
if input.is_exhausted()
{
return Ok(MediaList::empty());
}
let mut media_queries = vec![];
loop
{
match input.parse_until_before(Delimiter::Comma, |i| MediaQuery::parse(context, i))
{
Ok(mediaQuery) => media_queries.push(mediaQuery),
Err(error) =>
{
if !allowInvalidMediaQueries
{
return Err(error);
}
media_queries.push(MediaQuery::never_matching());
},
}
match input.next()
{
Ok(&Token::Comma) =>
{
},
Ok(_) => unreachable!(),
Err(_) => break,
}
}
Ok
(
MediaList
{
media_queries,
}
)
}
pub fn evaluate<D: Device>(&self, device: &D) -> bool
{
self.is_empty() || self.media_queries.iter().any(|mediaQuery|
{
use self::MediaQueryType::*;
let media_match = match mediaQuery.media_type
{
All => true,
Concrete(mediaType) => device.mediaTypeMatches(mediaType)
};
let query_match = media_match && mediaQuery.expressions.iter().all(|expression| expression.matches(device));
match mediaQuery.qualifier
{
Some(Qualifier::Not) => !query_match,
_ => query_match,
}
})
}
pub fn is_empty(&self) -> bool
{
self.media_queries.is_empty()
}
pub fn append_medium(&mut self, context: &ParserContext, new_medium: &str) -> bool
{
let mut input = ParserInput::new(new_medium);
let mut parser = Parser::new(&mut input);
let new_query = match MediaQuery::parse(&context, &mut parser)
{
Ok(query) => query,
Err(_) =>
{
return false;
}
};
self.media_queries.retain(|query| query != &new_query);
self.media_queries.push(new_query);
true
}
pub fn delete_medium(&mut self, context: &ParserContext, old_medium: &str) -> bool
{
let mut input = ParserInput::new(old_medium);
let mut parser = Parser::new(&mut input);
let old_query = match MediaQuery::parse(context, &mut parser)
{
Ok(query) => query,
Err(_) =>
{
return false;
}
};
let old_len = self.media_queries.len();
self.media_queries.retain(|query| query != &old_query);
old_len != self.media_queries.len()
}
}