use super::case::{pascal_to_screaming_snake, pascal_to_snake};
use crate::core::ir::{FieldDef, TypeRef};
use heck::{ToKebabCase, ToLowerCamelCase, ToPascalCase};
pub fn apply_serde_rename_all(name: &str, rename_all: Option<&str>) -> String {
match rename_all {
Some("lowercase") => name.to_ascii_lowercase(),
Some("UPPERCASE") => name.to_ascii_uppercase(),
Some("PascalCase") => name.to_pascal_case(),
Some("camelCase") => name.to_lower_camel_case(),
Some("snake_case") => pascal_to_snake(name),
Some("SCREAMING_SNAKE_CASE") => pascal_to_screaming_snake(name),
Some("kebab-case") => pascal_to_snake(name).to_kebab_case(),
Some("SCREAMING-KEBAB-CASE") => pascal_to_snake(name).to_kebab_case().to_ascii_uppercase(),
Some(_) | None => name.to_string(),
}
}
pub fn serde_wire_name(rust_name: &str, serde_rename: Option<&str>, rename_all: Option<&str>) -> String {
serde_rename
.map(str::to_string)
.unwrap_or_else(|| apply_serde_rename_all(rust_name, rename_all))
}
pub fn wire_field_name(field_name: &str, serde_rename: Option<&str>, rename_all: Option<&str>) -> String {
serde_wire_name(field_name, serde_rename, rename_all)
}
pub fn wire_variant_value(variant_name: &str, serde_rename: Option<&str>, rename_all: Option<&str>) -> String {
serde_wire_name(variant_name, serde_rename, rename_all)
}
pub fn field_uses_duration_map_wire(field: &FieldDef) -> bool {
matches!(field.ty, TypeRef::Duration) && field.serde_with.is_none()
}