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))]
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}