tailwind_css/modules/flexbox/flex/
mod.rs

1use super::*;
2
3pub(crate) mod flex_direction;
4pub(crate) mod flex_wrap;
5
6#[doc=include_str!("readme.md")]
7#[derive(Debug, Clone)]
8pub struct TailwindFlex {
9    kind: NumericValue,
10}
11
12impl Display for TailwindFlex {
13    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
14        write!(f, "flex-{}", self.kind)
15    }
16}
17
18impl TailwindInstance for TailwindFlex {
19    fn attributes(&self, _: &TailwindBuilder) -> CssAttributes {
20        let flex = self.kind.get_properties(|f| f.to_string());
21        css_attributes! {
22            "flex" => flex
23        }
24    }
25}
26
27impl TailwindFlex {
28    pub fn adapt(pattern: &[&str], arbitrary: &TailwindArbitrary) -> Result<Box<dyn TailwindInstance>> {
29        let out = match pattern {
30            // https://tailwindcss.com/docs/display#flex
31            // This won't happen
32            [] if arbitrary.is_none() => TailwindDisplay::from("flex").boxed(),
33            // https://tailwindcss.com/docs/flex#arbitrary-values
34            [] => TailwindFlex::parse_arbitrary(arbitrary)?.boxed(),
35            // https://tailwindcss.com/docs/flex-direction
36            ["row"] => TailwindFlexDirection::from("row").boxed(),
37            ["row", "reverse"] => TailwindFlexDirection::from("row-reverse").boxed(),
38            ["col"] => TailwindFlexDirection::from("column").boxed(),
39            ["col", "reverse"] => TailwindFlexDirection::from("column-reverse").boxed(),
40            ["direction", rest @ ..] => TailwindFlexDirection::parse(rest, arbitrary)?.boxed(),
41            // https://tailwindcss.com/docs/flex-wrap
42            ["wrap", rest @ ..] => TailwindFlexWrap::parse(rest, arbitrary)?.boxed(),
43            ["nowrap"] => TailwindFlexWrap::from("nowrap").boxed(),
44            // https://tailwindcss.com/docs/flex
45            _ => Self::parse(pattern, arbitrary)?.boxed(),
46        };
47        Ok(out)
48    }
49    /// <https://tailwindcss.com/docs/flex>
50    pub fn parse(pattern: &[&str], arbitrary: &TailwindArbitrary) -> Result<TailwindFlex> {
51        let kind = NumericValue::positive_parser("flex", &Self::check_valid)(pattern, arbitrary)?;
52        Ok(TailwindFlex { kind })
53    }
54    /// dispatch to [flex](https://developer.mozilla.org/en-US/docs/Web/CSS/flex)
55    pub fn parse_arbitrary(arbitrary: &TailwindArbitrary) -> Result<Self> {
56        NumericValue::parse_arbitrary(arbitrary).map(|kind| Self { kind })
57    }
58    /// <https://developer.mozilla.org/en-US/docs/Web/CSS/flex#syntax>
59    pub fn check_valid(mode: &str) -> bool {
60        let set = BTreeSet::from_iter(vec!["auto", "inherit", "initial", "initial", "none", "revert", "unset"]);
61        set.contains(mode)
62    }
63}