Skip to main content

tailwind_css/modules/typography/decoration/
mod.rs

1use super::*;
2
3pub(crate) mod color;
4pub(crate) mod line;
5pub(crate) mod style;
6pub(crate) mod thickness;
7
8#[derive(Debug, Clone)]
9pub struct TailwindDecoration {
10    arbitrary: TailwindArbitrary,
11}
12
13impl TailwindDecoration {
14    pub fn adapt(pattern: &[&str], arbitrary: &TailwindArbitrary) -> Result<Box<dyn TailwindInstance>> {
15        let out = match pattern {
16            // https://tailwindcss.com/docs/text-decoration
17            ["line", rest @ ..] => TailwindDecorationLine::parse(rest, arbitrary)?.boxed(),
18            // https://tailwindcss.com/docs/text-decoration-style
19            [s @ ("solid" | "double" | "dotted" | "dashed" | "wavy")] => TailwindDecorationStyle::from(*s).boxed(),
20            ["style", rest @ ..] => TailwindDecorationStyle::parse(rest, arbitrary)?.boxed(),
21            // https://tailwindcss.com/docs/text-decoration-thickness
22            ["auto"] => TailwindDecorationThickness::from("auto").boxed(),
23            ["from", "font"] => TailwindDecorationThickness::from("from-font").boxed(),
24            ["thick", rest @ ..] => TailwindDecorationThickness::parse(rest, arbitrary)?.boxed(),
25            // https://tailwindcss.com/docs/text-decoration-color
26            ["color", rest @ ..] => {
27                let color = TailwindColor::parse(rest, arbitrary)?;
28                TailwindDecorationColor::from(color).boxed()
29            },
30            // https://tailwindcss.com/docs/text-decoration-thickness
31            [] => TailwindDecoration { arbitrary: TailwindArbitrary::new(arbitrary)? }.boxed(),
32            [n] => resolve1(n)?,
33            _ => TailwindDecorationColor::parse(pattern, arbitrary)?.boxed(),
34        };
35        Ok(out)
36    }
37}
38
39impl Display for TailwindDecoration {
40    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
41        self.arbitrary.write_class(f, "decoration-")
42    }
43}
44
45impl TailwindInstance for TailwindDecoration {
46    fn attributes(&self, _: &TailwindBuilder) -> CssAttributes {
47        css_attributes! {
48            "text-decoration" => self.arbitrary.get_properties()
49        }
50    }
51}
52
53fn resolve1(n: &str) -> Result<Box<dyn TailwindInstance>> {
54    let a = TailwindArbitrary::from(n);
55    if n.starts_with(|c: char| c.is_numeric()) {
56        return Ok(resolve1_unit(&a)?.boxed());
57    }
58    if n.starts_with(|c: char| c == '#') {
59        return Ok(resolve1_color(&a)?.boxed());
60    }
61    Ok(TailwindDecorationColor::from(TailwindColor::Themed(n.to_string(), 0)).boxed())
62}
63
64fn resolve1_unit(a: &TailwindArbitrary) -> Result<TailwindDecorationThickness> {
65    Ok(TailwindDecorationThickness::from(a.as_integer()?))
66}
67
68fn resolve1_color(a: &TailwindArbitrary) -> Result<TailwindDecorationColor> {
69    Ok(TailwindDecorationColor::from(a.as_color()?))
70}