tailwind_css_fixes/modules/sizing/
builder.rs

1use super::*;
2
3impl SizingUnit {
4    pub fn parse(pattern: &[&str], arbitrary: &TailwindArbitrary) -> Result<Self> {
5        let px = |x| Ok(Self::Length(LengthUnit::px(x)));
6        match pattern {
7            ["none"] => Ok(Self::None),
8            ["min"] => Ok(Self::Min),
9            ["max"] => Ok(Self::Max),
10            ["auto"] => Ok(Self::Auto),
11            ["full"] => Ok(Self::Full),
12            ["fit"] => Ok(Self::Fit),
13            ["screen"] => Ok(Self::Screen),
14            ["0"] => px(0.0),
15            ["px"] => px(1.0),
16            [n] => Self::parse_arbitrary(&TailwindArbitrary::from(*n)),
17            [] => Self::parse_arbitrary(arbitrary),
18            _ => syntax_error!("Unknown sizing instructions: {}", pattern.join("-")),
19        }
20    }
21    pub fn parse_arbitrary(arbitrary: &TailwindArbitrary) -> Result<Self> {
22        Self::maybe_fraction(arbitrary).or_else(|_| Self::maybe_no_unit(arbitrary)).or_else(|_| Self::maybe_length(arbitrary))
23        // ! Does not match for the following test cases:
24        // parse_arbitrary: input=TailwindArbitrary { inner: "unset" }
25        // parse_arbitrary: input=TailwindArbitrary { inner: "xs" }
26    }
27    #[inline]
28    fn maybe_length(arbitrary: &TailwindArbitrary) -> Result<Self> {
29        Ok(Self::Length(arbitrary.as_length_or_fraction()?))
30    }
31    #[inline]
32    fn maybe_no_unit(arbitrary: &TailwindArbitrary) -> Result<Self> {
33        let rem = |x| Ok(Self::Length(LengthUnit::rem(x)));
34        rem(arbitrary.as_float()? / 4.0)
35    }
36    #[inline]
37    fn maybe_fraction(arbitrary: &TailwindArbitrary) -> Result<Self> {
38        let (a, b) = arbitrary.as_fraction()?;
39        Ok(Self::Fraction(a, b))
40    }
41}
42
43impl TailwindSizing {
44    #[inline]
45    pub fn parse_width(pattern: &[&str], arbitrary: &TailwindArbitrary) -> Result<Self> {
46        Ok(Self { kind: TailwindSizingKind::Width, size: SizingUnit::parse(pattern, arbitrary)? })
47    }
48    #[inline]
49    pub fn parse_width_max(pattern: &[&str], arbitrary: &TailwindArbitrary) -> Result<Self> {
50        Ok(Self { kind: TailwindSizingKind::MaxWidth, size: SizingUnit::parse(pattern, arbitrary)? })
51    }
52    #[inline]
53    pub fn parse_width_min(pattern: &[&str], arbitrary: &TailwindArbitrary) -> Result<Self> {
54        Ok(Self { kind: TailwindSizingKind::MinWidth, size: SizingUnit::parse(pattern, arbitrary)? })
55    }
56    #[inline]
57    pub fn parse_height(pattern: &[&str], arbitrary: &TailwindArbitrary) -> Result<Self> {
58        Ok(Self { kind: TailwindSizingKind::Height, size: SizingUnit::parse(pattern, arbitrary)? })
59    }
60    #[inline]
61    pub fn parse_height_max(pattern: &[&str], arbitrary: &TailwindArbitrary) -> Result<Self> {
62        Ok(Self { kind: TailwindSizingKind::MaxHeight, size: SizingUnit::parse(pattern, arbitrary)? })
63    }
64    #[inline]
65    pub fn parse_height_min(pattern: &[&str], arbitrary: &TailwindArbitrary) -> Result<Self> {
66        Ok(Self { kind: TailwindSizingKind::MinHeight, size: SizingUnit::parse(pattern, arbitrary)? })
67    }
68}