use super::*;
mod traits;
#[derive(Debug, Clone)]
pub enum StandardValue {
Keyword(String),
Arbitrary(TailwindArbitrary),
}
impl StandardValue {
pub fn parser(
id: &'static str,
check_valid: &'static impl Fn(&str) -> bool,
) -> impl Fn(&[&str], &TailwindArbitrary) -> Result<Self> {
move |pattern: &[&str], arbitrary: &TailwindArbitrary| match pattern {
[] => Self::parse_arbitrary(arbitrary),
_ => Self::parse_keyword(pattern, id, check_valid),
}
}
pub fn parse_arbitrary(arbitrary: &TailwindArbitrary) -> Result<Self> {
Ok(Self::Arbitrary(TailwindArbitrary::new(arbitrary)?))
}
pub fn parse_keyword(pattern: &[&str], id: &str, checker: &'static impl Fn(&str) -> bool) -> Result<Self> {
let keyword = pattern.join("-");
if cfg!(feature = "compile_time") && !checker(&keyword) {
return syntax_error!("{} does not a valid value of {}", keyword, id);
}
Ok(Self::Keyword(keyword))
}
pub fn get_properties(&self) -> &str {
match self {
Self::Keyword(s) => s.as_str(),
Self::Arbitrary(s) => s.as_str(),
}
}
pub fn get_value(&self) -> &str {
match self {
Self::Keyword(s) => s.as_str(),
Self::Arbitrary(s) => s.as_str(),
}
}
pub fn write_class(
&self,
fmt: &mut Formatter,
class_prefix: &str,
transformer: fn(&str) -> KeywordClassFormat,
) -> std::fmt::Result {
match self {
StandardValue::Keyword(s) => {
match transformer(s) {
KeywordClassFormat::CustomClassname(value) => write!(fmt, "{}", value),
KeywordClassFormat::AddAsSuffixCustom(value) => write!(fmt, "{}{}", class_prefix, value),
KeywordClassFormat::AddAsSuffix => write!(fmt, "{}{}", class_prefix, s),
KeywordClassFormat::InvalidKeyword => Err(std::fmt::Error).into(),
}
}
StandardValue::Arbitrary(s) => write!(fmt, "{}[{}]", class_prefix, s),
}
}
}
#[derive(Debug, Clone)]
pub enum KeywordClassFormat<'a> {
CustomClassname(&'a str),
AddAsSuffixCustom(&'a str),
AddAsSuffix,
InvalidKeyword,
}