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