css_ast/units/
frequency.rs

1use css_parse::{Build, Cursor, DimensionUnit, Parser, T};
2use csskit_derives::{IntoCursor, Peek, ToCursors};
3
4// https://drafts.csswg.org/css-values/#resolution
5#[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}