css_ast/units/
percentage.rs

1use super::prelude::*;
2
3#[derive(Peek, Parse, IntoCursor, ToCursors, Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
4#[cfg_attr(feature = "serde", derive(serde::Serialize), serde())]
5#[cfg_attr(feature = "visitable", derive(csskit_derives::Visitable), visit(self))]
6#[derive(csskit_derives::NodeWithMetadata)]
7#[metadata(node_kinds = Dimension)]
8pub struct Percentage(#[atom(CssAtomSet::Percentage)] T![Dimension]);
9
10impl Percentage {
11	pub fn value(&self) -> f32 {
12		self.0.into()
13	}
14}
15
16impl From<Percentage> for f32 {
17	fn from(percentage: Percentage) -> Self {
18		percentage.0.into()
19	}
20}
21
22impl From<Percentage> for i32 {
23	fn from(percentage: Percentage) -> Self {
24		f32::from(percentage) as i32
25	}
26}
27
28impl ToNumberValue for Percentage {
29	fn to_number_value(&self) -> Option<f32> {
30		Some((*self).into())
31	}
32}
33
34#[derive(Peek, Parse, ToCursors, IntoCursor, Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
35#[cfg_attr(feature = "serde", derive(serde::Serialize), serde())]
36#[cfg_attr(feature = "visitable", derive(csskit_derives::Visitable), visit(self))]
37#[derive(csskit_derives::NodeWithMetadata)]
38#[metadata(node_kinds = Dimension)]
39pub enum NumberPercentage {
40	Number(T![Number]),
41	Percentage(Percentage),
42}
43
44impl From<NumberPercentage> for f32 {
45	fn from(val: NumberPercentage) -> Self {
46		match val {
47			NumberPercentage::Number(n) => n.into(),
48			NumberPercentage::Percentage(n) => n.into(),
49		}
50	}
51}
52
53impl ToNumberValue for NumberPercentage {
54	fn to_number_value(&self) -> Option<f32> {
55		Some((*self).into())
56	}
57}
58
59#[cfg(test)]
60mod tests {
61	use super::*;
62	use crate::CssAtomSet;
63	use css_parse::assert_parse;
64
65	#[test]
66	fn size_test() {
67		assert_eq!(std::mem::size_of::<Percentage>(), 12);
68		assert_eq!(std::mem::size_of::<NumberPercentage>(), 16);
69	}
70
71	#[test]
72	fn test_writes() {
73		assert_parse!(CssAtomSet::ATOMS, Percentage, "1%");
74	}
75}