css_ast/units/
frequency.rs1use css_parse::{Build, Cursor, DimensionUnit, Parser, T};
2use csskit_derives::{IntoCursor, Peek, ToCursors};
3
4#[derive(Peek, ToCursors, IntoCursor, Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
6#[cfg_attr(feature = "serde", derive(serde::Serialize), serde())]
7pub enum Frequency {
8 Hz(T![Dimension::Hz]),
9 Khz(T![Dimension::Khz]),
10}
11
12impl From<Frequency> for f32 {
13 fn from(frequency: Frequency) -> Self {
14 match frequency {
15 Frequency::Hz(f) => f.into(),
16 Frequency::Khz(f) => f.into(),
17 }
18 }
19}
20
21impl<'a> Build<'a> for Frequency {
22 fn build(p: &Parser<'a>, c: Cursor) -> Self {
23 match c.token().dimension_unit() {
24 DimensionUnit::Hz => Self::Hz(<T![Dimension::Hz]>::build(p, c)),
25 DimensionUnit::Khz => Self::Khz(<T![Dimension::Khz]>::build(p, c)),
26 _ => unreachable!(),
27 }
28 }
29}
30
31#[cfg(test)]
32mod tests {
33 use super::*;
34 use css_parse::{assert_parse, assert_parse_error};
35
36 #[test]
37 fn size_test() {
38 assert_eq!(std::mem::size_of::<Frequency>(), 16);
39 }
40
41 #[test]
42 fn test_writes() {
43 assert_parse!(Frequency, "40hz");
44 assert_parse!(Frequency, "40khz");
45 }
46
47 #[test]
48 fn test_errors() {
49 assert_parse_error!(Frequency, "40w");
50 assert_parse_error!(Frequency, "40kw");
51 }
52}