css_ast/values/writing_modes/
impls.rs

1use super::{GlyphOrientationVerticalKeywords, GlyphOrientationVerticalStyleValue};
2use css_parse::{Parse, Parser, Peek, Result as ParseResult, T};
3
4pub(crate) use crate::traits::StyleValue;
5pub(crate) use csskit_derives::*;
6pub(crate) use csskit_proc_macro::*;
7
8impl<'a> Parse<'a> for GlyphOrientationVerticalStyleValue {
9	fn parse(p: &mut Parser<'a>) -> ParseResult<Self> {
10		match p.parse_if_peek::<GlyphOrientationVerticalKeywords>()? {
11			Some(GlyphOrientationVerticalKeywords::Auto(ident)) => Ok(Self::Auto(ident)),
12			None => {
13				if let Some(tk) = p.parse_if_peek::<crate::CSSInt>()? {
14					match tk.into() {
15						0i32 => {
16							return Ok(Self::Literal0(tk));
17						}
18						90i32 => {
19							return Ok(Self::Literal90(tk));
20						}
21						_ => {}
22					}
23				}
24				if let Some(tk) = p.parse_if_peek::<T![Dimension]>()? {
25					match tk.into() {
26						(0f32, ::css_parse::DimensionUnit::Deg) => {
27							return Ok(Self::Literal0deg(tk));
28						}
29						(90f32, ::css_parse::DimensionUnit::Deg) => {
30							return Ok(Self::Literal90deg(tk));
31						}
32						_ => {}
33					}
34				}
35				Err(crate::diagnostics::Unexpected(p.next()))?
36			}
37		}
38	}
39}
40
41#[cfg(test)]
42mod tests {
43	use super::super::*;
44	use css_parse::{assert_parse, assert_parse_error};
45
46	#[test]
47	fn size_test() {
48		assert_eq!(std::mem::size_of::<DirectionStyleValue>(), 16);
49		assert_eq!(std::mem::size_of::<UnicodeBidiStyleValue>(), 16);
50		assert_eq!(std::mem::size_of::<WritingModeStyleValue>(), 16);
51		assert_eq!(std::mem::size_of::<TextOrientationStyleValue>(), 16);
52		assert_eq!(std::mem::size_of::<GlyphOrientationVerticalStyleValue>(), 16);
53		assert_eq!(std::mem::size_of::<TextCombineUprightStyleValue>(), 28);
54	}
55
56	#[test]
57	fn test_parse() {
58		assert_parse!(GlyphOrientationVerticalStyleValue, "auto");
59		assert_parse!(GlyphOrientationVerticalStyleValue, "0");
60		assert_parse!(GlyphOrientationVerticalStyleValue, "90");
61		assert_parse!(GlyphOrientationVerticalStyleValue, "90deg");
62		assert_parse!(TextCombineUprightStyleValue, "none");
63		assert_parse!(TextCombineUprightStyleValue, "all");
64		assert_parse!(TextCombineUprightStyleValue, "digits");
65		assert_parse!(TextCombineUprightStyleValue, "digits 2");
66		assert_parse!(TextCombineUprightStyleValue, "digits 4");
67	}
68
69	#[test]
70	fn test_parse_error() {
71		assert_parse_error!(GlyphOrientationVerticalStyleValue, "128");
72		assert_parse_error!(GlyphOrientationVerticalStyleValue, "50deg");
73		assert_parse_error!(GlyphOrientationVerticalStyleValue, "50deg");
74		assert_parse_error!(TextCombineUprightStyleValue, "digits 1");
75		assert_parse_error!(TextCombineUprightStyleValue, "digits 2 2");
76		assert_parse_error!(TextCombineUprightStyleValue, "digits 5");
77	}
78
79	#[cfg(feature = "css_feature_data")]
80	#[test]
81	fn test_feature_data() {
82		use crate::assert_feature_id;
83		assert_feature_id!("all", TextCombineUprightStyleValue, "css.properties.text-combine-upright.all");
84		assert_feature_id!("none", TextCombineUprightStyleValue, "css.properties.text-combine-upright.none");
85		assert_feature_id!("digits 2", TextCombineUprightStyleValue, "css.properties.text-combine-upright");
86	}
87}