css_ast/units/
line_width.rs1use 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#[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}