#[derive(Clone, Copy)]
#[allow(clippy::enum_variant_names)]
pub(crate) enum RenameRule {
CamelCase,
SnakeCase,
PascalCase,
ScreamingSnakeCase,
KebabCase,
}
impl RenameRule {
pub(crate) fn apply(&self, s: &str) -> String {
match self {
RenameRule::CamelCase => to_camel_case(s),
RenameRule::SnakeCase => to_snake_case(s),
RenameRule::PascalCase => to_pascal_case(s),
RenameRule::ScreamingSnakeCase => to_snake_case(s).to_uppercase(),
RenameRule::KebabCase => to_snake_case(s).replace('_', "-"),
}
}
}
pub(crate) fn to_camel_case(s: &str) -> String {
let mut result = String::new();
let mut capitalize_next = false;
for c in s.chars() {
if c == '_' {
capitalize_next = true;
} else if capitalize_next {
result.extend(c.to_uppercase());
capitalize_next = false;
} else {
result.push(c);
}
}
result
}
pub(crate) fn to_snake_case(s: &str) -> String {
let mut result = String::new();
for (i, c) in s.chars().enumerate() {
if c.is_uppercase() && i > 0 {
result.push('_');
}
result.extend(c.to_lowercase());
}
result
}
pub(crate) fn to_pascal_case(s: &str) -> String {
let mut result = String::new();
let mut capitalize_next = true;
for c in s.chars() {
if c == '_' {
capitalize_next = true;
} else if capitalize_next {
result.extend(c.to_uppercase());
capitalize_next = false;
} else {
result.push(c);
}
}
result
}