css_ast/units/
time.rs

1use super::prelude::*;
2
3// https://drafts.csswg.org/css-values/#resolution
4#[derive(IntoCursor, Parse, Peek, ToCursors, Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
5#[cfg_attr(feature = "serde", derive(serde::Serialize), serde())]
6#[cfg_attr(feature = "visitable", derive(csskit_derives::Visitable), visit(self))]
7#[derive(csskit_derives::NodeWithMetadata)]
8#[metadata(node_kinds = Dimension)]
9pub enum Time {
10	Zero(Exact<T![Number], 0>),
11	#[atom(CssAtomSet::Ms)]
12	Ms(T![Dimension]),
13	#[atom(CssAtomSet::S)]
14	S(T![Dimension]),
15}
16
17impl Time {
18	pub fn as_seconds(&self) -> f32 {
19		match self {
20			Self::Zero(_) => 0.0,
21			Self::Ms(f) => Into::<f32>::into(*f) / 1000.0,
22			Self::S(f) => (*f).into(),
23		}
24	}
25}
26
27impl From<Time> for f32 {
28	fn from(val: Time) -> Self {
29		match val {
30			Time::Zero(_) => 0.0,
31			Time::Ms(f) => f.into(),
32			Time::S(f) => f.into(),
33		}
34	}
35}
36
37impl ToNumberValue for Time {
38	fn to_number_value(&self) -> Option<f32> {
39		Some((*self).into())
40	}
41}
42
43#[cfg(test)]
44mod tests {
45	use super::*;
46	use crate::CssAtomSet;
47	use css_parse::{assert_parse, assert_parse_error};
48
49	#[test]
50	fn size_test() {
51		assert_eq!(std::mem::size_of::<Time>(), 16);
52	}
53
54	#[test]
55	fn test_writes() {
56		assert_parse!(CssAtomSet::ATOMS, Time, "0");
57		assert_parse!(CssAtomSet::ATOMS, Time, "0s");
58		assert_parse!(CssAtomSet::ATOMS, Time, "0ms");
59	}
60
61	#[test]
62	fn test_errors() {
63		assert_parse_error!(CssAtomSet::ATOMS, Time, "1");
64		assert_parse_error!(CssAtomSet::ATOMS, Time, "foo");
65	}
66}