css_ast/units/
line_width.rs

1use css_parse::{Build, Cursor, Parser, Peek, T, keyword_set};
2use csskit_derives::{IntoCursor, ToCursors, Visitable};
3
4use super::Length;
5
6keyword_set!(pub enum LineWidthKeyword { Thin: "thin", Medium: "medium", Thick: "thick" });
7
8#[derive(IntoCursor, ToCursors, Visitable, Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
9#[cfg_attr(feature = "serde", derive(serde::Serialize), serde(rename_all = "kebab-case"))]
10#[visit]
11pub enum LineWidth {
12	#[visit(skip)]
13	Thin(T![Ident]),
14	#[visit(skip)]
15	Medium(T![Ident]),
16	#[visit(skip)]
17	Thick(T![Ident]),
18	Length(Length),
19}
20
21impl<'a> Peek<'a> for LineWidth {
22	fn peek(p: &Parser<'a>, c: Cursor) -> bool {
23		Length::peek(p, c) || LineWidthKeyword::peek(p, c)
24	}
25}
26
27impl<'a> Build<'a> for LineWidth {
28	fn build(p: &Parser<'a>, c: Cursor) -> Self {
29		if Length::peek(p, c) {
30			Self::Length(Length::build(p, c))
31		} else {
32			match LineWidthKeyword::build(p, c) {
33				LineWidthKeyword::Medium(_) => Self::Medium(<T![Ident]>::build(p, c)),
34				LineWidthKeyword::Thin(_) => Self::Thin(<T![Ident]>::build(p, c)),
35				LineWidthKeyword::Thick(_) => Self::Thick(<T![Ident]>::build(p, c)),
36			}
37		}
38	}
39}
40
41// impl From<LineWidth> for Length {
42// 	fn from(value: LineWidth) -> Self {
43// 		match value {
44// 			LineWidth::Thin => Length::Px(1.0.into()),
45// 			LineWidth::Medium => Length::Px(3.0.into()),
46// 			LineWidth::Thick => Length::Px(3.0.into()),
47// 			LineWidth::Length(length) => length,
48// 		}
49// 	}
50// }
51
52#[cfg(test)]
53mod tests {
54	use super::*;
55	use css_parse::assert_parse;
56
57	#[test]
58	fn size_test() {
59		assert_eq!(std::mem::size_of::<LineWidth>(), 16);
60	}
61
62	#[test]
63	fn test_writes() {
64		assert_parse!(LineWidth, "1px");
65		assert_parse!(LineWidth, "medium");
66	}
67}