use super::*;
pub(crate) mod ring_color;
pub(crate) mod ring_inset;
pub(crate) mod ring_offset_color;
pub(crate) mod ring_offset_width;
pub(crate) mod ring_width;
pub(crate) fn ring_adaptor(pattern: &[&str], arbitrary: &TailwindArbitrary) -> Result<Box<dyn TailwindInstance>> {
let out = match pattern {
["inset"] => TailwindRingInset {}.boxed(),
["offset", rest @ ..] => {
match rest {
["color", rest @ ..] => TailwindRingOffsetColor::parse(rest, arbitrary)?.boxed(),
[] if arbitrary.as_str().starts_with(|c: char| c.is_numeric()) => TailwindRingOffsetWidth::from(arbitrary).boxed(),
[n] => resolve_offset(n)?,
_ => TailwindRingOffsetColor::parse(rest, arbitrary)?.boxed(),
}
}
["black" | "white" | "inherit" | "current" | "transparent" | "revert"] =>
TailwindRingColor::parse(pattern, arbitrary)?.boxed(),
["color", rest @ ..] => TailwindOutlineColor::parse(rest, arbitrary)?.boxed(),
[] if arbitrary.is_some() => TailwindRingWidth::from(arbitrary).boxed(),
[] => {
let default_kind = UnitValue::Keyword("<DEFAULT>".to_string());
TailwindRingWidth::from(default_kind).boxed()
}
[n] => resolve1(n)?,
_ => TailwindRingColor::parse(pattern, arbitrary)?.boxed(),
};
Ok(out)
}
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_length(&a).or_else(|_| resolve1_unit(&a))?.boxed());
}
if n.starts_with('#') {
return Ok(resolve1_color(&a)?.boxed());
}
Ok(TailwindRingColor::from(TailwindColor::Themed{name: n.to_string(), weight: 0, alpha: None}).boxed())
}
fn resolve1_length(a: &TailwindArbitrary) -> Result<ring_width::TailwindRingWidth> {
Ok(ring_width::TailwindRingWidth::from(a.as_length()?))
}
fn resolve1_unit(a: &TailwindArbitrary) -> Result<ring_width::TailwindRingWidth> {
Ok(ring_width::TailwindRingWidth::from(a.as_integer()?))
}
fn resolve1_color(a: &TailwindArbitrary) -> Result<ring_color::TailwindRingColor> {
Ok(ring_color::TailwindRingColor::from(a.as_color()?))
}
fn resolve_offset(n: &str) -> Result<Box<dyn TailwindInstance>> {
let a = TailwindArbitrary::from(n);
if n.starts_with(|c: char| c.is_numeric()) {
return Ok(resolve_offset_length(&a).or_else(|_| resolve_offset_unit(&a))?.boxed());
}
if n.starts_with('#') {
return Ok(resolve_offset_color(&a)?.boxed());
}
Ok(TailwindRingOffsetColor::from(TailwindColor::Themed{name: n.to_string(), weight: 0, alpha: None}).boxed())
}
fn resolve_offset_length(a: &TailwindArbitrary) -> Result<ring_offset_width::TailwindRingOffsetWidth> {
Ok(ring_offset_width::TailwindRingOffsetWidth::from(a.as_length()?))
}
fn resolve_offset_unit(a: &TailwindArbitrary) -> Result<ring_offset_width::TailwindRingOffsetWidth> {
Ok(ring_offset_width::TailwindRingOffsetWidth::from(a.as_integer()?))
}
fn resolve_offset_color(a: &TailwindArbitrary) -> Result<ring_offset_color::TailwindRingOffsetColor> {
Ok(ring_offset_color::TailwindRingOffsetColor::from(a.as_color()?))
}