css_ast/units/
resolution.rs

1use css_parse::{Build, Cursor, DimensionUnit, Parser, T};
2use csskit_derives::{IntoCursor, Peek, ToCursors};
3
4// const DPPX_IN: f32 = 96.0;
5// const DPPX_CM: f32 = DPPX_IN / 2.54;
6
7// https://drafts.csswg.org/css-values/#resolution
8#[derive(Peek, ToCursors, IntoCursor, Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
9#[cfg_attr(feature = "serde", derive(serde::Serialize), serde())]
10pub enum Resolution {
11	Dpi(T![Dimension::Dpi]),
12	Dpcm(T![Dimension::Dpcm]),
13	Dppx(T![Dimension::Dppx]),
14	X(T![Dimension::X]),
15}
16
17impl From<Resolution> for f32 {
18	fn from(res: Resolution) -> Self {
19		match res {
20			Resolution::Dpi(r) => r.into(),
21			Resolution::Dpcm(r) => r.into(),
22			Resolution::Dppx(r) => r.into(),
23			Resolution::X(r) => r.into(),
24		}
25	}
26}
27
28impl<'a> Build<'a> for Resolution {
29	fn build(p: &Parser<'a>, c: Cursor) -> Self {
30		match c.token().dimension_unit() {
31			DimensionUnit::Dpi => Self::Dpi(<T![Dimension::Dpi]>::build(p, c)),
32			DimensionUnit::Dpcm => Self::Dpcm(<T![Dimension::Dpcm]>::build(p, c)),
33			DimensionUnit::Dppx => Self::Dppx(<T![Dimension::Dppx]>::build(p, c)),
34			DimensionUnit::X => Self::X(<T![Dimension::X]>::build(p, c)),
35			_ => unreachable!(),
36		}
37	}
38}
39
40#[cfg(test)]
41mod tests {
42	use super::*;
43	use css_parse::assert_parse;
44
45	#[test]
46	fn size_test() {
47		assert_eq!(std::mem::size_of::<Resolution>(), 16);
48	}
49
50	#[test]
51	fn test_writes() {
52		assert_parse!(Resolution, "1dppx");
53		assert_parse!(Resolution, "1x");
54	}
55}