css_ast/units/
flex.rs

1use css_parse::{Build, Cursor, Parser, Peek, T, ToNumberValue};
2use csskit_derives::{IntoCursor, ToCursors, Visitable};
3
4// https://www.w3.org/TR/css-grid-2/#typedef-flex
5#[derive(IntoCursor, ToCursors, Visitable, Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
6#[cfg_attr(feature = "serde", derive(serde::Serialize), serde())]
7#[visit(self)]
8pub struct Flex(T![Dimension::Fr]);
9
10impl From<Flex> for f32 {
11	fn from(flex: Flex) -> Self {
12		flex.0.into()
13	}
14}
15
16impl ToNumberValue for Flex {
17	fn to_number_value(&self) -> Option<f32> {
18		Some((*self).into())
19	}
20}
21
22impl<'a> Peek<'a> for Flex {
23	fn peek(p: &Parser<'a>, c: Cursor) -> bool {
24		<T![Dimension::Fr]>::peek(p, c)
25	}
26}
27
28impl<'a> Build<'a> for Flex {
29	fn build(p: &Parser<'a>, c: Cursor) -> Self {
30		Self(<T![Dimension::Fr]>::build(p, c))
31	}
32}
33
34#[cfg(test)]
35mod tests {
36	use super::*;
37	use css_parse::assert_parse;
38
39	#[test]
40	fn size_test() {
41		assert_eq!(std::mem::size_of::<Flex>(), 12);
42	}
43
44	#[test]
45	fn test_writes() {
46		assert_parse!(Flex, "1fr");
47	}
48}