use syn::LitStr;
use crate::codegen::util::{to_camel_case, to_pascal_case, to_snake_case};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[allow(clippy::enum_variant_names)]
pub enum RenameRule {
SnakeCase,
PascalCase,
CamelCase,
}
impl RenameRule {
pub fn from_lit(lit: &LitStr) -> syn::Result<Self> {
match lit.value().as_str() {
"snake_case" => Ok(RenameRule::SnakeCase),
"PascalCase" => Ok(RenameRule::PascalCase),
"camelCase" => Ok(RenameRule::CamelCase),
other => Err(syn::Error::new(
lit.span(),
format!(
"unknown rename rule `{other}`; \
expected `snake_case`, `PascalCase`, or `camelCase`"
),
)),
}
}
pub fn json_key_to_rust_name(self, key: &str) -> String {
match self {
RenameRule::SnakeCase => key.to_owned(),
RenameRule::PascalCase | RenameRule::CamelCase => to_snake_case(key),
}
}
pub fn rust_name_to_json_key(self, name: &str) -> String {
match self {
RenameRule::SnakeCase => name.to_owned(),
RenameRule::PascalCase => to_pascal_case(name),
RenameRule::CamelCase => to_camel_case(name),
}
}
}