pub fn camel_case(subject: &str) -> String {
camel_and_pascal_case(subject, TitleMode::Normal)
}
#[derive(Clone, Copy, PartialEq)]
enum TitleMode {
Normal,
Caps,
}
fn camel_and_pascal_case(subject: &str, title_mode: TitleMode) -> String {
return match subject.len() {
0 => subject.to_string(),
_ => return_string(subject, title_mode),
};
fn return_string(subject: &str, title_mode: TitleMode) -> String {
let mut res = String::with_capacity(subject.len());
for (i, c) in crate::split::words(subject).iter().enumerate() {
let s = if i == 0 && title_mode == TitleMode::Normal {
lower_case(c)
} else {
capitalize(c, true)
};
res.push_str(&s);
}
res
}
}
pub fn capitalize(subject: &str, rest_to_lower: bool) -> String {
let rest_to_lower_mode = if rest_to_lower {
RestMode::Lower
} else {
RestMode::Normal
};
capitalize_decapitalize(subject, rest_to_lower_mode, CapsMode::Caps)
}
#[derive(Clone, Copy, PartialEq)]
enum RestMode {
Lower,
Normal,
}
#[derive(Clone, Copy, PartialEq)]
enum CapsMode {
Caps,
Small,
}
fn capitalize_decapitalize(subject: &str, rest_mode: RestMode, caps_mode: CapsMode) -> String {
return match subject.len() {
0 => subject.to_string(),
_ => return_string(subject, rest_mode, caps_mode),
};
fn return_string(subject: &str, rest_mode: RestMode, caps_mode: CapsMode) -> String {
let mut res = String::with_capacity(subject.len());
for (i, c) in crate::split::chars(subject).iter().enumerate() {
let s = if i == 0 {
match caps_mode {
CapsMode::Caps => c.to_uppercase(),
CapsMode::Small => c.to_lowercase(),
}
} else {
match rest_mode {
RestMode::Lower => c.to_lowercase(),
RestMode::Normal => (*c).to_string(),
}
};
res.push_str(&s);
}
res
}
}
pub fn decapitalize(subject: &str, rest_to_lower: bool) -> String {
let rest_to_lower_mode = if rest_to_lower {
RestMode::Lower
} else {
RestMode::Normal
};
capitalize_decapitalize(subject, rest_to_lower_mode, CapsMode::Small)
}
pub fn kebab_case(subject: &str) -> String {
kebab_and_shouty_kebab_and_train_case(subject, KebabMode::Normal)
}
pub fn shouty_kebab_case(subject: &str) -> String {
kebab_and_shouty_kebab_and_train_case(subject, KebabMode::Shouty)
}
#[derive(Clone, Copy, PartialEq)]
enum KebabMode {
Normal,
Shouty,
Train,
}
fn kebab_and_shouty_kebab_and_train_case(subject: &str, kebab_mode: KebabMode) -> String {
match subject.len() {
0 => subject.to_string(),
_ => crate::split::words(subject)
.into_iter()
.map(|c| match kebab_mode {
KebabMode::Normal => lower_case(c),
KebabMode::Shouty => upper_case(c),
KebabMode::Train => capitalize(c, true),
})
.collect::<Vec<String>>()
.join("-"),
}
}
pub fn lower_case(subject: &str) -> String {
match subject.len() {
0 => subject.to_string(),
_ => {
let mut res = String::with_capacity(subject.len());
for c in crate::split::chars(subject).iter() {
res.push_str(&c.to_lowercase());
}
res
}
}
}
pub fn pascal_case(subject: &str) -> String {
camel_and_pascal_case(subject, TitleMode::Caps)
}
pub fn snake_case(subject: &str) -> String {
snake_and_shouty_snake_case(subject, false)
}
pub fn shouty_snake_case(subject: &str) -> String {
snake_and_shouty_snake_case(subject, true)
}
fn snake_and_shouty_snake_case(subject: &str, shouty: bool) -> String {
match subject.len() {
0 => subject.to_string(),
_ => crate::split::words(subject)
.into_iter()
.map(|c| {
if shouty {
upper_case(c)
} else {
lower_case(c)
}
})
.collect::<Vec<String>>()
.join("_"),
}
}
pub fn swap_case(subject: &str) -> String {
match subject.len() {
0 => subject.to_string(),
_ => crate::split::chars(subject)
.into_iter()
.map(|s| {
s.chars()
.filter_map(|c| {
if c.is_lowercase() {
c.to_uppercase().next()
} else {
c.to_lowercase().next()
}
})
.collect()
})
.collect::<Vec<String>>()
.join(""),
}
}
pub fn title_case(subject: &str) -> String {
match subject.len() {
0 => subject.to_string(),
_ => crate::split::words(subject)
.into_iter()
.map(|c| capitalize(c, true))
.collect::<Vec<String>>()
.join(" "),
}
}
pub fn train_case(subject: &str) -> String {
kebab_and_shouty_kebab_and_train_case(subject, KebabMode::Train)
}
pub fn upper_case(subject: &str) -> String {
match subject.len() {
0 => subject.to_string(),
_ => {
let mut res = String::with_capacity(subject.len());
for c in crate::split::chars(subject).iter() {
res.push_str(&c.to_uppercase());
}
res
}
}
}
pub fn lower_first(subject: &str) -> String {
decapitalize(subject, false)
}
pub fn upper_first(subject: &str) -> String {
capitalize(subject, false)
}