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