1use crate::CssUnit;
2use std::fmt;
3use std::fmt::Display;
4
5#[derive(Debug, Copy, Clone)]
7pub struct CssNumber(f64, usize, CssUnit);
8
9impl Display for CssNumber {
10 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
12 if self.2 == CssUnit::Auto {
13 write!(f, "auto")
14 } else if self.0 == 0.0 {
15 write!(f, "0")
16 } else {
17 write!(f, "{0:.1$}{2}", self.0, self.1, self.2)
18 }
19 }
20}
21
22impl CssNumber {
23 pub fn new(value: f64, precision: usize, unit: CssUnit) -> Self {
25 Self(value, precision, unit)
26 }
27}
28
29#[macro_export]
30macro_rules! css_num {
31 ($value:expr, $precision:expr, $unit:expr) => {
32 CssNumber::new($value, $precision, $unit)
33 };
34}
35
36#[macro_export]
37macro_rules! px {
38 ($value:expr) => {
39 CssNumber::new($value as f64, 0, CssUnit::Px)
40 };
41}
42
43#[macro_export]
44macro_rules! pt {
45 ($value:expr, $precision:expr) => {
46 CssNumber::new($value as f64, $precision, CssUnit::Pt)
47 };
48 ($value:expr) => {
49 CssNumber::new($value as f64, 0, CssUnit::Pt)
50 };
51}
52
53#[macro_export]
54macro_rules! em {
55 ($value:expr, $precision:expr) => {
56 CssNumber::new($value as f64, $precision, CssUnit::Em)
57 };
58 ($value:expr) => {
59 CssNumber::new($value as f64, 0, CssUnit::Em)
60 };
61}
62
63#[macro_export]
64macro_rules! perc {
65 ($value:expr, $precision:expr) => {
66 CssNumber::new($value as f64, $precision, CssUnit::Perc)
67 };
68 ($value:expr) => {
69 CssNumber::new($value as f64, 0, CssUnit::Perc)
70 };
71}
72
73#[macro_export]
74macro_rules! zero {
75 () => {
76 CssNumber::new(0.0, 0, CssUnit::None)
77 };
78}
79
80#[macro_export]
81macro_rules! auto {
82 () => {
83 CssNumber::new(0.0, 0, CssUnit::Auto)
84 };
85}