tailwind_css/modules/flexbox/basis/
mod.rs1use 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 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 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}