use {
crate::{
domain::{
expressions::CalculablePropertyValue,
numbers::{CssNumber, CssSignedNumber},
units::{ResolutionUnit, Unit},
},
parsers::ParserContext,
CustomParseError,
},
cssparser::{ParseError, Parser, ToCss, Token},
std::fmt,
};
#[derive(Clone, Debug, PartialEq)]
pub enum MediaResolution {
infinite,
finite(CalculablePropertyValue<ResolutionUnit<CssSignedNumber>>),
}
impl ToCss for MediaResolution {
fn to_css<W: fmt::Write>(&self, dest: &mut W) -> fmt::Result {
use self::MediaResolution::*;
match *self {
infinite => dest.write_str("infinite"),
finite(ref value) => value.to_css(dest),
}
}
}
impl MediaResolution {
pub(crate) fn parseWebKit<'i, 't>(
input: &mut Parser<'i, 't>,
) -> Result<Self, ParseError<'i, CustomParseError<'i>>> {
use self::MediaResolution::*;
let value = match *input.next()? {
Token::Number { value, .. } => CssSignedNumber::new(value).map_err(
|cssNumberConversionError| {
ParseError::from(
CustomParseError::CouldNotParseCssSignedNumber(
cssNumberConversionError,
value,
),
)
},
),
ref unexpectedToken => {
CustomParseError::unexpectedToken(unexpectedToken)
}
}?;
Ok(finite(CalculablePropertyValue::Constant(
ResolutionUnit::dppx(value),
)))
}
pub(crate) fn parse<'i, 't>(
context: &ParserContext,
input: &mut Parser<'i, 't>,
) -> Result<Self, ParseError<'i, CustomParseError<'i>>> {
use self::MediaResolution::*;
if input.r#try(|i| i.expect_ident_matching("auto")).is_ok() {
return Ok(infinite);
}
Ok(finite(ResolutionUnit::parse_one_outside_calc_function(
context, input,
)?))
}
}