use std::borrow::Cow;
use std::collections::hash_map::DefaultHasher;
use std::hash::{Hash, Hasher};
pub fn strip_raw_identifier_prefix(ident_str: &str) -> Cow<'_, str> {
if let Some(stripped) = ident_str.strip_prefix("r#") {
Cow::Borrowed(stripped)
} else {
Cow::Borrowed(ident_str)
}
}
pub fn capitalize_first_letter(s: &str) -> String {
if s.is_empty() {
return String::new();
}
let mut chars = s.chars();
match chars.next() {
None => String::new(), Some(first) => {
first.to_uppercase().collect::<String>() + chars.as_str()
}
}
}
pub fn snake_case_to_pascal_case(snake_case_str: &str) -> String {
if snake_case_str.is_empty() {
return String::new();
}
snake_case_str
.split('_')
.map(capitalize_first_letter)
.collect::<Vec<String>>()
.join("")
}
pub fn generate_unique_identifier(base_name: &str) -> String {
let mut hasher = DefaultHasher::new();
let timestamp = std::time::SystemTime::now()
.duration_since(std::time::UNIX_EPOCH)
.unwrap_or_default() .as_nanos();
base_name.hash(&mut hasher);
timestamp.hash(&mut hasher);
let hash = hasher.finish();
let suffix = format!("{:08x}", (hash as u32));
format!("{base_name}_{suffix}")
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_strip_raw_identifier_prefix() {
assert_eq!(strip_raw_identifier_prefix("r#type"), "type");
assert_eq!(strip_raw_identifier_prefix("r#match"), "match");
assert_eq!(strip_raw_identifier_prefix("r#fn"), "fn");
assert_eq!(strip_raw_identifier_prefix("field_name"), "field_name");
assert_eq!(strip_raw_identifier_prefix("my_field"), "my_field");
assert_eq!(strip_raw_identifier_prefix("x"), "x");
assert_eq!(strip_raw_identifier_prefix(""), "");
assert_eq!(strip_raw_identifier_prefix("r#"), "");
assert_eq!(strip_raw_identifier_prefix("r#r#test"), "r#test"); }
#[test]
fn test_capitalize_first_letter() {
assert_eq!(capitalize_first_letter("field"), "Field");
assert_eq!(capitalize_first_letter("field_name"), "Field_name");
assert_eq!(capitalize_first_letter("user_id"), "User_id");
assert_eq!(capitalize_first_letter("a"), "A");
assert_eq!(capitalize_first_letter("Field"), "Field");
assert_eq!(capitalize_first_letter("A"), "A");
assert_eq!(capitalize_first_letter(""), "");
assert_eq!(capitalize_first_letter("1field"), "1field"); assert_eq!(capitalize_first_letter("_field"), "_field"); }
#[test]
fn test_snake_case_to_pascal_case_examples() {
assert_eq!(snake_case_to_pascal_case("language_id"), "LanguageId");
assert_eq!(snake_case_to_pascal_case("fqn_separator"), "FqnSeparator");
assert_eq!(snake_case_to_pascal_case("user"), "User");
assert_eq!(snake_case_to_pascal_case("user_name"), "UserName");
}
#[test]
fn test_snake_case_to_pascal_case() {
assert_eq!(snake_case_to_pascal_case("language_id"), "LanguageId");
assert_eq!(snake_case_to_pascal_case("fqn_separator"), "FqnSeparator");
assert_eq!(snake_case_to_pascal_case("user_name"), "UserName");
assert_eq!(snake_case_to_pascal_case("api_key"), "ApiKey");
assert_eq!(snake_case_to_pascal_case("user"), "User");
assert_eq!(snake_case_to_pascal_case("name"), "Name");
assert_eq!(snake_case_to_pascal_case("id"), "Id");
assert_eq!(
snake_case_to_pascal_case("very_long_field_name"),
"VeryLongFieldName"
);
assert_eq!(snake_case_to_pascal_case("a_b_c_d"), "ABCD");
assert_eq!(snake_case_to_pascal_case(""), "");
assert_eq!(snake_case_to_pascal_case("_"), "");
assert_eq!(snake_case_to_pascal_case("__"), "");
assert_eq!(snake_case_to_pascal_case("field_"), "Field");
assert_eq!(snake_case_to_pascal_case("_field"), "Field");
assert_eq!(snake_case_to_pascal_case("field_1"), "Field1");
assert_eq!(snake_case_to_pascal_case("user_2fa"), "User2fa");
assert_eq!(snake_case_to_pascal_case("api_v2_key"), "ApiV2Key");
}
}