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