forked from parcel-bundler/lightningcss
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathnumber.rs
More file actions
70 lines (63 loc) · 1.72 KB
/
number.rs
File metadata and controls
70 lines (63 loc) · 1.72 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
use cssparser::*;
use crate::traits::{Parse, ToCss};
use crate::printer::Printer;
use std::fmt::Write;
use super::calc::Calc;
impl Parse for f32 {
fn parse<'i, 't>(input: &mut Parser<'i, 't>) -> Result<Self, ParseError<'i, ()>> {
match input.try_parse(Calc::parse) {
Ok(Calc::Value(v)) => return Ok(*v),
Ok(Calc::Number(n)) => return Ok(n),
// Numbers are always compatible, so they will always compute to a value.
Ok(_) => return Err(input.new_error(BasicParseErrorKind::QualifiedRuleInvalid)),
_ => {}
}
if let Ok(number) = input.try_parse(|input| input.expect_number()) {
return Ok(number)
}
Err(input.new_error_for_next_token())
}
}
impl ToCss for f32 {
fn to_css<W>(&self, dest: &mut Printer<W>) -> std::fmt::Result where W: std::fmt::Write {
serialize_number(*self, dest)
}
}
impl std::convert::Into<Calc<f32>> for f32 {
fn into(self) -> Calc<f32> {
Calc::Value(Box::new(self))
}
}
impl std::convert::From<Calc<f32>> for f32 {
fn from(calc: Calc<f32>) -> f32 {
match calc {
Calc::Value(v) => *v,
_ => unreachable!()
}
}
}
pub fn serialize_number<W>(number: f32, dest: &mut Printer<W>) -> std::fmt::Result where W: std::fmt::Write {
use cssparser::ToCss;
let int_value = if number.fract() == 0.0 {
Some(number as i32)
} else {
None
};
let tok = Token::Number {
has_sign: number < 0.0,
value: number,
int_value
};
if number != 0.0 && number.abs() < 1.0 {
let mut s = String::new();
tok.to_css(&mut s)?;
if number < 0.0 {
dest.write_char('-')?;
dest.write_str(s.trim_start_matches("-0"))
} else {
dest.write_str(s.trim_start_matches('0'))
}
} else {
tok.to_css(dest)
}
}