#![allow(clippy::pub_use)]
pub use cruet::case::camel::is_camel_case;
pub use cruet::case::camel::to_camel_case;
pub use cruet::case::kebab::is_kebab_case;
pub use cruet::case::kebab::to_kebab_case;
pub use cruet::case::pascal::is_pascal_case;
pub use cruet::case::pascal::to_pascal_case;
pub use cruet::case::screaming_snake::is_screaming_snake_case as is_constant_case;
pub use cruet::case::screaming_snake::to_screaming_snake_case as to_constant_case;
pub use cruet::case::sentence::is_sentence_case;
pub use cruet::case::sentence::to_sentence_case;
pub use cruet::case::table::is_table_case;
pub use cruet::case::table::to_table_case;
pub use cruet::case::title::is_title_case;
pub use cruet::case::title::to_title_case;
pub use cruet::case::train::is_train_case;
pub use cruet::case::train::to_train_case;
#[inline]
#[must_use]
pub fn is_class_case(test_string: &str) -> bool {
to_class_case(test_string) == test_string
}
#[inline]
#[must_use]
pub fn to_class_case(non_class_case_string: &str) -> String {
let mut characters = non_class_case_string.chars();
let mut prefix_length = 0;
while let Some(character) = characters.next() {
if character.is_uppercase() {
prefix_length += 1;
continue;
}
if character.is_numeric() {
prefix_length += 1;
continue;
}
if character.is_lowercase() && prefix_length > 0 {
prefix_length += 1;
for character in characters.by_ref() {
if character.is_lowercase() || character.is_numeric() {
prefix_length += 1;
} else {
break;
}
}
break;
}
break;
}
let prefix = &non_class_case_string[..prefix_length];
let remaining = &non_class_case_string[prefix_length..];
if remaining.is_empty() {
return prefix.to_string();
}
if prefix.is_empty() {
return cruet::case::to_case_camel_like(
non_class_case_string,
cruet::case::CamelOptions {
new_word: true,
last_char: ' ',
first_word: false,
injectable_char: ' ',
has_seperator: false,
inverted: false,
concat_num: true,
},
);
}
let mut class_name = crate::to_class_case(remaining);
class_name.insert_str(0, prefix);
class_name
}
#[inline]
#[must_use]
pub fn is_snake_case(test_string: &str) -> bool {
test_string == to_snake_case(test_string)
}
#[inline]
#[must_use]
pub fn to_snake_case(non_snake_case_string: &str) -> String {
let mut first_character = true;
let mut last_separator = true;
let mut result = String::with_capacity(non_snake_case_string.len() * 2);
for char_with_index in non_snake_case_string.trim_end_matches(|c: char| !c.is_alphanumeric()).char_indices() {
if char_with_index.1.is_alphanumeric() {
first_character = false;
if !last_separator
&& !first_character
&& char_with_index.1.is_uppercase()
&& (non_snake_case_string.chars().nth(char_with_index.0 + 1).unwrap_or('A').is_lowercase()
|| non_snake_case_string.chars().nth(char_with_index.0 - 1).unwrap_or('A').is_lowercase())
{
last_separator = true;
result.push('_');
} else {
last_separator = false;
}
result.push(char_with_index.1.to_ascii_lowercase());
} else if !first_character && !last_separator {
first_character = true;
last_separator = true;
result.push('_');
} else {
}
}
result
}