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