css_ast/units/
float.rs

1use css_parse::{Build, Cursor, Parser, Peek, T};
2use csskit_derives::{IntoCursor, ToCursors};
3
4#[derive(ToCursors, IntoCursor, Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
5#[cfg_attr(feature = "serde", derive(serde::Serialize), serde(transparent))]
6pub struct CSSFloat(T![Number]);
7
8impl CSSFloat {
9	#[allow(non_upper_case_globals)]
10	pub const Zero: CSSFloat = CSSFloat(<T![Number]>::ZERO);
11}
12
13impl From<CSSFloat> for i32 {
14	fn from(value: CSSFloat) -> Self {
15		value.0.into()
16	}
17}
18
19impl From<CSSFloat> for f32 {
20	fn from(value: CSSFloat) -> Self {
21		value.0.into()
22	}
23}
24
25impl<'a> Peek<'a> for CSSFloat {
26	fn peek(p: &Parser<'a>, c: Cursor) -> bool {
27		<T![Number]>::peek(p, c) && c.token().is_float()
28	}
29}
30
31impl<'a> Build<'a> for CSSFloat {
32	fn build(p: &Parser<'a>, c: Cursor) -> Self {
33		Self(<T![Number]>::build(p, c))
34	}
35}
36
37#[cfg(test)]
38mod tests {
39	use super::*;
40	use css_parse::assert_parse;
41
42	#[test]
43	fn size_test() {
44		assert_eq!(std::mem::size_of::<CSSFloat>(), 12);
45	}
46
47	#[test]
48	fn test_writes() {
49		assert_parse!(CSSFloat, "0.01");
50		assert_parse!(CSSFloat, "3.141");
51	}
52}