use crate::derives::*;
use crate::values::specified::{NoCalcLength, Number, Percentage, Time};
use crate::values::CSSFloat;
use cssparser::match_ignore_ascii_case;
use style_traits::ParsingMode;
#[derive(Clone, ToTyped)]
#[repr(u8)]
pub enum NoCalcNumeric {
Length(NoCalcLength),
Time(Time),
Number(Number),
Percentage(Percentage),
}
impl NoCalcNumeric {
pub fn unitless_value(&self) -> CSSFloat {
match *self {
Self::Length(v) => v.unitless_value(),
Self::Time(v) => v.unitless_value(),
Self::Number(v) => v.get(),
Self::Percentage(v) => v.get(),
}
}
pub fn unit(&self) -> &'static str {
match *self {
Self::Length(v) => v.unit(),
Self::Time(v) => v.unit(),
Self::Number(v) => v.unit(),
Self::Percentage(v) => v.unit(),
}
}
pub fn canonical_unit(&self) -> Option<&'static str> {
match *self {
Self::Length(v) => v.canonical_unit(),
Self::Time(v) => v.canonical_unit(),
Self::Number(v) => v.canonical_unit(),
Self::Percentage(v) => v.canonical_unit(),
}
}
pub fn to(&self, unit: &str) -> Result<Self, ()> {
match self {
Self::Length(v) => Ok(Self::Length(v.to(unit)?)),
Self::Time(v) => Ok(Self::Time(v.to(unit)?)),
Self::Number(v) => Ok(Self::Number(v.to(unit)?)),
Self::Percentage(v) => Ok(Self::Percentage(v.to(unit)?)),
}
}
pub fn parse_unit_value(value: CSSFloat, unit: &str) -> Result<Self, ()> {
if let Ok(length) = NoCalcLength::parse_dimension_with_flags(
ParsingMode::DEFAULT,
false,
value,
unit,
) {
return Ok(NoCalcNumeric::Length(length));
}
if let Ok(time) = Time::parse_dimension(value, unit) {
return Ok(NoCalcNumeric::Time(time));
}
match_ignore_ascii_case! { unit,
"number" => Ok(NoCalcNumeric::Number(Number::new(value))),
"percent" => Ok(NoCalcNumeric::Percentage(Percentage::new(value))),
_ => Err(()),
}
}
}