1use css_parse::{Build, Cursor, Parser, Peek, T, ToNumberValue};
2use csskit_derives::{IntoCursor, ToCursors, Visitable};
3
4#[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}