1use super::*;
2
3impl TailwindInstruction {
5 #[inline(never)]
6 pub fn get_instance(&self) -> Result<Box<dyn TailwindInstance>> {
7 let element = self.view_elements();
8 let pattern = element.as_slice();
9 let arbitrary = self.view_arbitrary();
10 let neg = self.negative;
11 let instance = match pattern {
12 ["aspect", rest @ ..] => TailwindAspect::parse(rest, arbitrary)?.boxed(),
14 ["container"] => TailwindContainer::default().boxed(),
15 ["columns", rest @ ..] => TailwindColumns::parse(rest, arbitrary)?.boxed(),
16 ["break", rest @ ..] => TailwindBreak::parse(rest, arbitrary)?,
17 ["box", rest @ ..] => Self::box_adaptor(rest, arbitrary)?,
18 ["block"] => TailwindDisplay::from("block").boxed(),
21 ["inline", "block"] => TailwindDisplay::from("inline-block").boxed(),
22 ["inline"] => TailwindDisplay::from("inline").boxed(),
23 ["inline", "flex"] => TailwindDisplay::from("inline-flex").boxed(),
24 ["inline", "table"] => TailwindDisplay::from("inline-table").boxed(),
25 ["flow", "root"] => TailwindDisplay::from("flow-root").boxed(),
26 ["grid"] => TailwindDisplay::from("grid").boxed(),
27 ["inline", "grid"] => TailwindDisplay::from("inline-grid").boxed(),
28 ["contents"] => TailwindDisplay::from("contents").boxed(),
29 ["list", "item"] => TailwindDisplay::from("inline-grid").boxed(),
30 ["hidden"] => TailwindDisplay::from("hidden").boxed(),
31 ["float", rest @ ..] => TailwindFloat::parse(rest, arbitrary)?.boxed(),
33 ["clear", rest @ ..] => TailwindClear::parse(rest, arbitrary)?.boxed(),
34 ["isolate"] => TailwindIsolation::from("isolate").boxed(),
35 ["isolation", rest @ ..] => TailwindIsolation::parse(rest, arbitrary)?.boxed(),
36 ["object", rest @ ..] => object_adaptor(rest, arbitrary)?,
37 ["overflow", rest @ ..] => TailwindOverflow::parse(rest, arbitrary)?.boxed(),
38 ["overscroll", rest @ ..] => TailwindOverscroll::parse(rest, arbitrary)?.boxed(),
39 [s @ ("static" | "fixed" | "absolute" | "relative" | "sticky")] => TailwindPosition::from(*s).boxed(),
41 ["position", rest @ ..] => TailwindPosition::parse(rest, arbitrary)?.boxed(),
42 ["inset", rest @ ..] => TailwindInset::parse(rest, arbitrary, neg)?.boxed(),
44 ["top", rest @ ..] => TailwindTop::parse(rest, arbitrary, neg)?.boxed(),
45 ["right", rest @ ..] => TailwindRight::parse(rest, arbitrary, neg)?.boxed(),
46 ["bottom", rest @ ..] => TailwindBottom::parse(rest, arbitrary, neg)?.boxed(),
47 ["left", rest @ ..] => TailwindLeft::parse(rest, arbitrary, neg)?.boxed(),
48 ["start", rest @ ..] => TailwindStart::parse(rest, arbitrary, neg)?.boxed(),
49 ["end", rest @ ..] => TailwindEnd::parse(rest, arbitrary, neg)?.boxed(),
50 ["invisible"] => TailwindVisibility::from("hidden").boxed(),
52 ["visible" | "visibility", rest @ ..] => TailwindVisibility::parse(rest, arbitrary)?.boxed(),
53 ["z", rest @ ..] => TailwindZIndex::parse(rest, arbitrary, neg)?.boxed(),
55 ["basis", rest @ ..] => TailwindBasis::parse(rest, arbitrary)?.boxed(),
57 ["flex", rest @ ..] => TailwindFlex::adapt(rest, arbitrary)?,
58 ["grow", rest @ ..] => TailWindGrow::parse(rest, arbitrary)?.boxed(),
59 ["shrink", rest @ ..] => TailWindShrink::parse(rest, arbitrary)?.boxed(),
60 ["order", rest @ ..] => TailWindOrder::parse(rest, arbitrary, neg)?.boxed(),
61 ["grid", rest @ ..] => TailwindGrid::adapt(rest, arbitrary)?,
62 ["col", rest @ ..] => TailwindColumn::parse(rest, arbitrary)?.boxed(),
64 ["row", rest @ ..] => TailwindRow::parse(rest, arbitrary)?.boxed(),
65 ["auto", rest @ ..] => TailwindGridAuto::parse(rest, arbitrary)?.boxed(),
66 ["gap", rest @ ..] => TailwindGap::parse(rest, arbitrary)?.boxed(),
67 ["justify", rest @ ..] => justify_adaptor(rest, arbitrary)?,
68 ["content", rest @ ..] => TailwindContent::adapt(rest, arbitrary)?,
69 ["items", rest @ ..] => TailwindItems::parse(rest, arbitrary)?.boxed(),
70 ["self", rest @ ..] => TailwindSelf::parse(rest, arbitrary)?.boxed(),
71 ["place", rest @ ..] => TailwindPlace::adapt(rest, arbitrary)?,
72 ["p" | "pl" | "pr" | "pb" | "pt" | "px" | "py", ..] => TailwindPadding::parse(pattern, arbitrary, neg)?.boxed(),
75 ["m" | "ml" | "mr" | "mb" | "mt" | "mx" | "my", ..] => TailwindMargin::parse(pattern, arbitrary, neg)?.boxed(),
76 ["space", rest @ ..] => TailwindSpace::parse(rest, arbitrary, neg)?,
77 ["w", rest @ ..] => TailwindSizing::parse_width(rest, arbitrary)?.boxed(),
79 ["min", "w", rest @ ..] => TailwindSizing::parse_width_min(rest, arbitrary)?.boxed(),
80 ["max", "w", rest @ ..] => TailwindSizing::parse_width_max(rest, arbitrary)?.boxed(),
81 ["h", rest @ ..] => TailwindSizing::parse_height(rest, arbitrary)?.boxed(),
82 ["min", "h", rest @ ..] => TailwindSizing::parse_height_min(rest, arbitrary)?.boxed(),
83 ["max", "h", rest @ ..] => TailwindSizing::parse_height_max(rest, arbitrary)?.boxed(),
84 ["font", rest @ ..] => font_adaptor(rest, arbitrary)?,
86 ["text", rest @ ..] => text_adaptor(rest, arbitrary)?,
87 ["antialiased"] => TailwindFontSmoothing::from("todo").boxed(),
89 ["subpixel", "antialiased"] => TailwindFontSmoothing::from("todo").boxed(),
90 ["italic"] => TailwindFontStyle::from("italic").boxed(),
91 ["not", "italic"] => TailwindFontStyle::from("normal").boxed(),
92 ["normal", "nums"] => TailwindFontVariantNumeric::from("normal").boxed(),
94 ["ordinal"] => TailwindFontVariantNumeric::from("ordinal").boxed(),
95 ["slashed", "zero"] => TailwindFontVariantNumeric::from("slashed-zero").boxed(),
96 ["lining", "nums"] => TailwindFontVariantNumeric::from("lining-nums").boxed(),
97 ["oldstyle", "nums"] => TailwindFontVariantNumeric::from("oldstyle-nums").boxed(),
98 ["proportional", "nums"] => TailwindFontVariantNumeric::from("proportional-nums").boxed(),
99 ["tabular", "nums"] => TailwindFontVariantNumeric::from("tabular-nums").boxed(),
100 ["diagonal", "fractions"] => TailwindFontVariantNumeric::from("diagonal-fractions").boxed(),
101 ["stacked", "fractions"] => TailwindFontVariantNumeric::from("stacked-fractions").boxed(),
102 ["tracking", rest @ ..] => TailwindTracking::parse(rest, arbitrary)?.boxed(),
104 ["leading", rest @ ..] => TailwindLeading::parse(rest, arbitrary)?.boxed(),
105 ["list", rest @ ..] => list_adaptor(rest, arbitrary)?,
106 ["underline"] => TailwindDecorationLine::from("underline").boxed(),
108 ["overline"] => TailwindDecorationLine::from("overline").boxed(),
109 ["line", "through"] => TailwindDecorationLine::from("line-through").boxed(),
110 ["no", "underline"] => TailwindDecorationLine::from("none").boxed(),
111 ["decoration", rest @ ..] => TailwindDecoration::adapt(rest, arbitrary)?,
113 ["underline", "offset", rest @ ..] => TailwindUnderlineOffset::parse(rest, arbitrary)?.boxed(),
114 ["uppercase"] => TailwindTextTransform::from("uppercase").boxed(),
116 ["lowercase"] => TailwindTextTransform::from("lowercase").boxed(),
117 ["capitalize"] => TailwindTextTransform::from("capitalize").boxed(),
118 ["normal", "case"] => TailwindTextTransform::from("none").boxed(),
119 ["truncate"] => TailwindTextOverflow::Truncate.boxed(),
121 ["indent", rest @ ..] => TailwindIndent::parse(rest, arbitrary)?.boxed(),
122 ["align", rest @ ..] => TailwindAlign::parse(rest, arbitrary)?.boxed(),
123 ["whitespace", rest @ ..] => TailwindWhiteSpace::parse(rest, arbitrary)?.boxed(),
124 ["prose"] => todo!(),
128 ["bg", rest @ ..] => Self::bg_adaptor(rest, arbitrary, neg)?,
130 ["from", rest @ ..] => TailwindFrom::parse(rest, arbitrary)?.boxed(),
131 ["via", rest @ ..] => TailwindVia::parse(rest, arbitrary)?.boxed(),
132 ["to", rest @ ..] => TailwindTo::parse(rest, arbitrary)?.boxed(),
133 ["rounded", rest @ ..] => TailwindRounded::parse(rest, arbitrary)?.boxed(),
135 ["border", rest @ ..] => Self::border_adaptor(rest, arbitrary)?,
136 ["divide", rest @ ..] => TailwindDivide::adapt(rest, arbitrary)?,
137 ["outline", rest @ ..] => outline_adaptor(rest, arbitrary)?,
138 ["ring", rest @ ..] => ring_adaptor(rest, arbitrary)?,
139 ["shadow", rest @ ..] => Self::shadow_adaptor(rest, arbitrary)?,
141 ["opacity", rest @ ..] => TailwindOpacity::parse(rest, arbitrary, false)?.boxed(),
142 ["mix", "blend", rest @ ..] => TailwindBlend::parse(rest, arbitrary)?.boxed(),
143 ["blur", rest @ ..] => TailwindBlur::parse(rest, arbitrary, false)?.boxed(),
145 ["brightness", rest @ ..] => TailwindBrightness::parse(rest, arbitrary, false)?.boxed(),
146 ["contrast", rest @ ..] => TailwindContrast::parse(rest, arbitrary, false)?.boxed(),
147 ["drop", "shadow", rest @ ..] => TailwindShadow::parse(rest, arbitrary, true)?.boxed(),
148 ["grayscale", rest @ ..] => TailwindGrayscale::parse(rest, arbitrary, false)?.boxed(),
149 ["hue", "rotate", rest @ ..] => TailwindHueRotate::parse(rest, arbitrary, false, neg)?.boxed(),
150 ["invert", rest @ ..] => TailwindInvert::parse(rest, arbitrary, false)?.boxed(),
151 ["saturate", rest @ ..] => TailwindSaturate::parse(rest, arbitrary, false)?.boxed(),
152 ["sepia", rest @ ..] => TailwindSepia::parse(rest, arbitrary, false)?.boxed(),
153 ["backdrop", rest @ ..] => Self::backdrop_adaptor(rest, arbitrary, neg)?,
154 ["table", rest @ ..] => Self::table_adaptor(rest, arbitrary)?,
156 ["transition", rest @ ..] => TailwindTransition::parse(rest, arbitrary)?.boxed(),
158 ["duration", rest @ ..] => TailwindDuration::parse(rest, arbitrary)?.boxed(),
159 ["ease", rest @ ..] => TailwindEase::parse(rest, arbitrary)?.boxed(),
160 ["delay", rest @ ..] => TailwindDelay::parse(rest, arbitrary)?.boxed(),
161 ["animate", rest @ ..] => TailwindAnimate::parse(rest, arbitrary)?.boxed(),
162 ["scale", rest @ ..] => TailwindScale::parse(rest, arbitrary, neg)?.boxed(),
164 ["rotate", rest @ ..] => TailwindRotate::parse(rest, arbitrary, neg)?.boxed(),
165 ["translate", rest @ ..] => TailwindTranslate::parse(rest, arbitrary, neg)?.boxed(),
166 ["skew", rest @ ..] => TailwindSkew::parse(rest, arbitrary, neg)?.boxed(),
167 ["origin", rest @ ..] => TailwindOrigin::parse(rest, arbitrary)?.boxed(),
168 ["accent", rest @ ..] => TailwindAccentColor::parse(rest, arbitrary)?.boxed(),
170 ["appearance", rest @ ..] => TailwindAppearance::parse(rest, arbitrary)?.boxed(),
172 ["cursor", rest @ ..] => TailwindCursor::parse(rest, arbitrary)?.boxed(),
173 ["caret", rest @ ..] => TailwindCaretColor::parse(rest, arbitrary)?.boxed(),
174 ["pointer", "events", rest @ ..] => TailwindPointerEvents::parse(rest, arbitrary)?.boxed(),
175 ["resize", rest @ ..] => TailwindResize::parse(rest, arbitrary)?.boxed(),
176 ["scroll", rest @ ..] => scroll_adaptor(rest, arbitrary, neg)?,
177 ["snap", rest @ ..] => snap_adaptor(rest, arbitrary)?,
178 ["touch", rest @ ..] => TailwindTorch::parse(rest, arbitrary)?.boxed(),
179 ["select", rest @ ..] => TailwindSelect::parse(rest, arbitrary)?.boxed(),
180 ["will", "change", rest @ ..] => TailwindWillChange::parse(rest, arbitrary)?.boxed(),
181 ["fill", rest @ ..] => TailwindFillColor::parse(rest, arbitrary)?.boxed(),
183 ["stroke", rest @ ..] => TailwindStroke::parse(rest, arbitrary)?,
184 ["sr", "only"] => TailwindScreenReader::new(true).boxed(),
186 ["not", "sr", "only"] => TailwindScreenReader::new(false).boxed(),
187 ["peer"] => TailwindVariantMarker::parse(pattern, arbitrary)?.boxed(),
189 ["group"] => TailwindVariantMarker::parse(pattern, arbitrary)?.boxed(),
190 _ => return syntax_error!("Unknown instructions: {} + {}", element.join("-"), arbitrary.get_class()),
192 };
193 Ok(instance)
194 }
195 #[inline]
196 fn bg_adaptor(pattern: &[&str], arbitrary: &TailwindArbitrary, neg: Negative) -> Result<Box<dyn TailwindInstance>> {
197 let out = match pattern {
198 [s @ ("fixed" | "local" | "scroll")] => TailwindBackgroundAttachment::from(*s).boxed(),
200 ["attach", rest @ ..] => TailwindBackgroundAttachment::parse(rest, arbitrary)?.boxed(),
201 ["clip", rest @ ..] => TailwindBackgroundClip::parse(rest, arbitrary)?.boxed(),
203 ["origin", rest @ ..] => TailwindBackgroundOrigin::parse(rest, arbitrary)?.boxed(),
205 ["no", "repeat"] => TailwindBackgroundRepeat::from("no-repeat").boxed(),
207 ["repeat", rest @ ..] => TailwindBackgroundRepeat::parse(rest, arbitrary)?.boxed(),
208 [s @ ("auto" | "cover" | "contain")] => TailwindBackgroundSize::from(*s).boxed(),
210 ["size", rest @ ..] => TailwindBackgroundSize::parse(rest, arbitrary)?.boxed(),
211 ["blend", rest @ ..] => TailwindBackgroundBlend::parse(rest, arbitrary)?.boxed(),
213 ["none"] | ["gradient" | "linear" | "radial" | "conic", ..] => {
216 TailwindBackgroundImage::parse(pattern, arbitrary, neg)?.boxed()
217 }
218 [] => {
219 if arbitrary.as_str().starts_with("url(") || arbitrary.as_str().contains("gradient(") {
220 TailwindBackgroundImage::parse(pattern, arbitrary, neg)?.boxed()
221 } else {
222 TailwindBackgroundColor::parse(pattern, arbitrary)?.boxed()
224 }
225 }
226 _ => TailwindBackgroundColor::parse(pattern, arbitrary)?.boxed()
227 };
228 Ok(out)
229 }
230 #[inline]
231 fn border_adaptor(pattern: &[&str], arbitrary: &TailwindArbitrary) -> Result<Box<dyn TailwindInstance>> {
232 let color = |color| TailwindBorderColor::from(color).boxed();
233 let out = match pattern {
234 [s @ ("solid" | "dashed" | "dotted" | "double" | "hidden" | "none")] => TailwindBorderStyle::from(*s).boxed(),
236 ["separate"] => TailwindBorderCollapse::from("separate").boxed(),
238 ["collapse"] if arbitrary.is_none() => TailwindBorderCollapse::from("collapse").boxed(),
239 ["collapse", rest @ ..] => TailwindBorderCollapse::parse(rest, arbitrary)?.boxed(),
240 [] => {
242 if arbitrary.as_str().starts_with('#') {
243 TailwindBorderColor::from(arbitrary.as_color()?).boxed()
244 } else {
245 TailwindBorderWidth::parse(pattern, arbitrary)?.boxed()
246 }
247 }, ["0" | "2" | "4" | "8", ..] if arbitrary.is_none() => TailwindBorderWidth::parse(pattern, arbitrary)?.boxed(), ["x" | "y" | "t" | "r" | "b" | "l", ..] => TailwindBorderWidth::parse(pattern, arbitrary)?.boxed(), ["black"] => color(TailwindColor::Black),
252 ["white"] => color(TailwindColor::White),
253 ["color", rest @ ..] => TailwindBorderColor::parse(rest, arbitrary)?.boxed(),
255 _ => TailwindBorderColor::parse(pattern, arbitrary)?.boxed(),
256 };
257 Ok(out)
258 }
259 #[inline]
260 fn shadow_adaptor(pattern: &[&str], arbitrary: &TailwindArbitrary) -> Result<Box<dyn TailwindInstance>> {
261 let out = match pattern {
262 ["black" | "white" | "current" | "transparent"] => TailwindShadowColor::parse(pattern, arbitrary)?.boxed(),
264 ["color", rest @ ..] => TailwindShadowColor::parse(rest, arbitrary)?.boxed(),
265 _ => TailwindShadow::parse(pattern, arbitrary, false)?.boxed(),
267 };
268 Ok(out)
269 }
270 #[inline]
271 fn box_adaptor(str: &[&str], arbitrary: &TailwindArbitrary) -> Result<Box<dyn TailwindInstance>> {
272 let out = match str {
273 ["decoration" | "break", rest @ ..] => TailwindBoxDecoration::parse(rest, arbitrary)?.boxed(),
275 ["clone"] => TailwindBoxDecoration::from("clone").boxed(),
276 ["slice"] => TailwindBoxDecoration::from("slice").boxed(),
277 ["border"] => TailwindBoxSizing::from("border-box").boxed(),
279 ["content"] => TailwindBoxSizing::from("content-box").boxed(),
280 ["sizing", rest @ ..] => TailwindBoxSizing::parse(rest, arbitrary)?.boxed(),
281 _ => return syntax_error!("Unknown box instructions: {}", str.join("-")),
282 };
283 Ok(out)
284 }
285
286 #[inline]
287 fn backdrop_adaptor(str: &[&str], arbitrary: &TailwindArbitrary, negative: Negative) -> Result<Box<dyn TailwindInstance>> {
288 let out = match str {
289 ["blur", rest @ ..] => TailwindBlur::parse(rest, arbitrary, true)?.boxed(),
291 ["brightness", rest @ ..] => TailwindBrightness::parse(rest, arbitrary, true)?.boxed(),
293 ["contrast", rest @ ..] => TailwindContrast::parse(rest, arbitrary, true)?.boxed(),
295 ["grayscale", rest @ ..] => TailwindGrayscale::parse(rest, arbitrary, true)?.boxed(),
297 ["hue", "rotate", rest @ ..] => TailwindHueRotate::parse(rest, arbitrary, true, negative)?.boxed(),
299 ["invert", rest @ ..] => TailwindInvert::parse(rest, arbitrary, true)?.boxed(),
301 ["opacity", rest @ ..] => TailwindOpacity::parse(rest, arbitrary, true)?.boxed(),
303 ["saturate", rest @ ..] => TailwindSaturate::parse(rest, arbitrary, true)?.boxed(),
305 ["sepia", rest @ ..] => TailwindSepia::parse(rest, arbitrary, true)?.boxed(),
307 _ => return syntax_error!("Unknown backdrop instructions: {}", str.join("-")),
308 };
309 Ok(out)
310 }
311 #[inline]
312 fn table_adaptor(pattern: &[&str], arbitrary: &TailwindArbitrary) -> Result<Box<dyn TailwindInstance>> {
313 let out = match pattern {
314 [] if arbitrary.is_none() => TailwindDisplay::from("table").boxed(),
316 ["caption"] => TailwindDisplay::from("table-caption").boxed(),
317 ["cell"] => TailwindDisplay::from("table-cell").boxed(),
318 ["column"] => TailwindDisplay::from("table-column").boxed(),
319 ["column", "group"] => TailwindDisplay::from("table-column-group").boxed(),
320 ["footer", "group"] => TailwindDisplay::from("table-footer-group").boxed(),
321 ["header", "group"] => TailwindDisplay::from("table-header-group").boxed(),
322 ["row", "group"] => TailwindDisplay::from("table-row-group").boxed(),
323 ["row"] => TailwindDisplay::from("table-row").boxed(),
324 _ => TailwindTableLayout::parse(pattern, arbitrary)?.boxed(),
326 };
327 Ok(out)
328 }
329}