tailwind_css/modules/typography/decoration/
mod.rs1use 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 ["line", rest @ ..] => TailwindDecorationLine::parse(rest, arbitrary)?.boxed(),
18 [s @ ("solid" | "double" | "dotted" | "dashed" | "wavy")] => TailwindDecorationStyle::from(*s).boxed(),
20 ["style", rest @ ..] => TailwindDecorationStyle::parse(rest, arbitrary)?.boxed(),
21 ["auto"] => TailwindDecorationThickness::from("auto").boxed(),
23 ["from", "font"] => TailwindDecorationThickness::from("from-font").boxed(),
24 ["thick", rest @ ..] => TailwindDecorationThickness::parse(rest, arbitrary)?.boxed(),
25 ["color", rest @ ..] => {
27 let color = TailwindColor::parse(rest, arbitrary)?;
28 TailwindDecorationColor::from(color).boxed()
29 },
30 [] => 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}