pub const VOID_ELEMENTS: &[&str] = &[
"area", "base", "br", "col", "embed", "hr", "img", "input", "link", "meta", "param", "source",
"track", "wbr",
];
pub fn component_fn_name(pascal: &str) -> String {
let mut out = String::with_capacity(pascal.len() + 4);
for (i, c) in pascal.chars().enumerate() {
if c.is_ascii_uppercase() {
if i > 0 {
out.push('_');
}
out.push(c.to_ascii_lowercase());
} else {
out.push(c);
}
}
out
}
pub fn known_typed_setters(component: &str) -> &'static [&'static str] {
match component {
"Button" => &["variant", "size", "class"],
"Badge" => &["variant", "class"],
"Alert" => &["variant", "class"],
"Input" => &["class"],
"Label" => &["class", "for"],
"Textarea" => &["class"],
"Card" => &["class"],
"Separator" => &["orientation", "class"],
"Dialog" => &[
"id",
"title",
"description",
"close_button",
"close_on_overlay_click",
"class",
],
"Tabs" => &["id", "tabsets", "default_tab_index", "orientation", "class"],
"Toast" => &["category", "title", "description", "class"],
"Toaster" => &["id", "class"],
"Tooltip" => &["content", "side", "class"],
_ => &[],
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn pascal_to_snake() {
assert_eq!(component_fn_name("Button"), "button");
assert_eq!(component_fn_name("DialogContent"), "dialog_content");
assert_eq!(component_fn_name("TabsList"), "tabs_list");
assert_eq!(
component_fn_name("AlertDialogOverlay"),
"alert_dialog_overlay"
);
assert_eq!(component_fn_name("Toaster"), "toaster");
}
#[test]
fn void_elements_list() {
assert!(VOID_ELEMENTS.contains(&"br"));
assert!(VOID_ELEMENTS.contains(&"img"));
assert!(VOID_ELEMENTS.contains(&"input"));
assert!(!VOID_ELEMENTS.contains(&"div"));
}
}