use std::borrow::Cow;
pub use heck::AsLowerCamelCase;
use heck::{AsKebabCase, AsPascalCase, AsShoutySnakeCase, AsSnakeCase};
#[inline]
pub fn to_element_name(name: &str) -> Cow<'_, str> {
if name.starts_with(|c: char| c.is_ascii_digit()) {
return Cow::Owned(format!("_{name}"));
}
let converted = format!("{}", AsLowerCamelCase(name));
if converted == name {
Cow::Borrowed(name)
} else {
Cow::Owned(converted)
}
}
#[inline]
pub fn dom_key<'a>(name: &'a str, rename: Option<&'a str>) -> Cow<'a, str> {
match rename {
Some(r) => Cow::Borrowed(r),
None => to_element_name(name),
}
}
pub fn apply_rename_all(name: &str, rename_all: &str) -> String {
match rename_all {
"lowercase" => name.to_lowercase(),
"UPPERCASE" => name.to_uppercase(),
"PascalCase" | "UpperCamelCase" => format!("{}", AsPascalCase(name)),
"camelCase" | "lowerCamelCase" => format!("{}", AsLowerCamelCase(name)),
"snake_case" => format!("{}", AsSnakeCase(name)),
"SCREAMING_SNAKE_CASE" | "UPPER_SNAKE_CASE" => format!("{}", AsShoutySnakeCase(name)),
"kebab-case" => format!("{}", AsKebabCase(name)),
"SCREAMING-KEBAB-CASE" | "UPPER-KEBAB-CASE" => {
format!("{}", AsKebabCase(name)).to_uppercase()
}
_ => name.to_string(),
}
}