css_ast/units/
percentage.rs1use 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}