tailwind_css/modules/flexbox/basis/
mod.rs

1use super::*;
2
3#[derive(Debug, Clone)]
4enum Basis {
5    Number(f32),
6    Length(LengthUnit),
7    Standard(String),
8    Arbitrary(TailwindArbitrary),
9}
10
11#[doc=include_str!("readme.md")]
12#[derive(Debug, Clone)]
13pub struct TailwindBasis {
14    kind: Basis,
15}
16
17impl Display for TailwindBasis {
18    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
19        write!(f, "basis-")?;
20        match &self.kind {
21            Basis::Number(n) => write!(f, "{}", n),
22            Basis::Length(n) if n.is_fraction() => write!(f, "{}", n.get_class()),
23            Basis::Length(n) => write!(f, "{}", n.get_class_arbitrary()),
24            Basis::Standard(s) => match s.as_str() {
25                "fit-content" => write!(f, "fit"),
26                "min-content" => write!(f, "min"),
27                "max-content" => write!(f, "max"),
28                _ => write!(f, "{}", s),
29            },
30            Basis::Arbitrary(s) => s.write(f),
31        }
32    }
33}
34
35impl TailwindInstance for TailwindBasis {
36    fn attributes(&self, _: &TailwindBuilder) -> CssAttributes {
37        let basis = match &self.kind {
38            Basis::Number(n) => format!("{}rem", *n as f32 / 4.0),
39            Basis::Length(n) => n.get_properties(),
40            Basis::Standard(s) => s.to_string(),
41            Basis::Arbitrary(s) => s.get_properties(),
42        };
43        css_attributes! {
44            "flex-basis" => basis
45        }
46    }
47}
48
49impl TailwindBasis {
50    /// <https://tailwindcss.com/docs/flex-basis>
51    pub fn parse(pattern: &[&str], arbitrary: &TailwindArbitrary) -> Result<Self> {
52        Ok(Self { kind: Basis::parse(pattern, arbitrary)? })
53    }
54
55    pub fn parse_arbitrary(arbitrary: &TailwindArbitrary) -> Result<Self> {
56        Ok(Self { kind: Basis::parse_arbitrary(arbitrary)? })
57    }
58    /// https://developer.mozilla.org/en-US/docs/Web/CSS/flex-basis#syntax
59    pub fn check_valid(mode: &str) -> bool {
60        Basis::check_valid(mode)
61    }
62}
63
64impl Basis {
65    pub fn parse(pattern: &[&str], arbitrary: &TailwindArbitrary) -> Result<Self> {
66        let out = match pattern {
67            ["px"] => Self::Length(LengthUnit::px(1.0)),
68            ["full"] => Self::Length(LengthUnit::Fraction(1, 1)),
69            ["fit" | "min" | "max", "content"] => Self::Standard(pattern.join("-")),
70            [s @ ("fit" | "min" | "max")] => Self::Standard(format!("{}-content", s)),
71            [s] if Self::check_valid(s) => Self::Standard(s.to_string()),
72            [n] => {
73                let a = TailwindArbitrary::from(*n);
74                Self::maybe_length(&a).or_else(|_| Self::maybe_float(&a))?
75            },
76            [] => Self::parse_arbitrary(arbitrary)?,
77            _ => return syntax_error!("Unknown basis instructions"),
78        };
79        Ok(out)
80    }
81    pub fn parse_arbitrary(arbitrary: &TailwindArbitrary) -> Result<Self> {
82        Ok(Self::Arbitrary(TailwindArbitrary::new(arbitrary)?))
83    }
84    fn maybe_float(arbitrary: &TailwindArbitrary) -> Result<Self> {
85        Ok(Self::Number(arbitrary.as_float()?))
86    }
87    fn maybe_length(arbitrary: &TailwindArbitrary) -> Result<Self> {
88        Ok(Self::Length(arbitrary.as_length_or_fraction()?))
89    }
90    pub fn check_valid(mode: &str) -> bool {
91        let set = BTreeSet::from_iter(vec![
92            "auto",
93            "content",
94            "fill",
95            "fit-content",
96            "inherit",
97            "initial",
98            "max-content",
99            "min-content",
100            "revert",
101            "unset",
102        ]);
103        set.contains(mode)
104    }
105}