domrs/css/
numbers.rs

1use crate::CssUnit;
2use std::fmt;
3use std::fmt::Display;
4
5/// A structure representing the CSS number.
6#[derive(Debug, Copy, Clone)]
7pub struct CssNumber(f64, usize, CssUnit);
8
9impl Display for CssNumber {
10  /// Implements [Display] for [CssNumber].
11  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  /// Creates a new number based on provided value, precision and unit.
24  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}