use std::str::FromStr;
use crate::error::{ Error, Result };
use self::RenameRule::*;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum RenameRule {
LowerCase,
Uppercase,
PascalCase,
CamelCase,
SnakeCase,
ScreamingSnakeCase,
KebabCase,
ScreamingKebabCase,
}
impl RenameRule {
pub fn apply_to_field(self, field: String) -> String {
match self {
LowerCase | SnakeCase => field,
Uppercase => field.to_ascii_uppercase(),
PascalCase => {
let mut pascal = String::new();
let mut capitalize = true;
for ch in field.chars() {
if ch == '_' {
capitalize = true;
} else if capitalize {
pascal.push(ch.to_ascii_uppercase());
capitalize = false;
} else {
pascal.push(ch);
}
}
pascal
}
CamelCase => {
let pascal = PascalCase.apply_to_field(field);
pascal[..1].to_ascii_lowercase() + &pascal[1..]
}
ScreamingSnakeCase => field.to_ascii_uppercase(),
KebabCase => field.replace('_', "-"),
ScreamingKebabCase => ScreamingSnakeCase.apply_to_field(field).replace('_', "-"),
}
}
}
impl FromStr for RenameRule {
type Err = Error;
fn from_str(s: &str) -> Result<Self> {
match s {
"lowercase" => Ok(LowerCase),
"UPPERCASE" => Ok(Uppercase),
"PascalCase" => Ok(PascalCase),
"camelCase" => Ok(CamelCase),
"snake_case" => Ok(SnakeCase),
"SCREAMING_SNAKE_CASE" => Ok(ScreamingSnakeCase),
"kebab-case" => Ok(KebabCase),
"SCREAMING-KEBAB-CASE" => Ok(ScreamingKebabCase),
_ => err_fmt!("unknown `rename_all` rule: {}", s),
}
}
}