use super::case::{pascal_to_pascal, pascal_to_screaming_snake, pascal_to_snake};
use super::identifiers::escape_identifier_for;
use super::languages::{
csharp_type_name, csharp_variant_name, go_param_name, go_type_name, go_variant_name, to_csharp_name, to_go_name,
};
use super::surfaces::{IdentifierContext, PublicIdentifierKind};
use crate::core::config::Language;
use heck::{ToLowerCamelCase, ToPascalCase, ToSnakeCase};
pub fn public_field_name(lang: Language, rust_field_name: &str, rename_fields_value: Option<&str>) -> String {
let base = rename_fields_value.unwrap_or(rust_field_name);
public_host_identifier(lang, PublicIdentifierKind::Field, base)
}
pub fn public_host_identifier(lang: Language, kind: PublicIdentifierKind, rust_name: &str) -> String {
let converted = public_casing(lang, kind, rust_name);
escape_identifier_for(lang, &converted, public_identifier_context(kind))
}
pub(crate) fn public_casing(lang: Language, kind: PublicIdentifierKind, rust_name: &str) -> String {
match kind {
PublicIdentifierKind::Type => public_type_name(lang, rust_name),
PublicIdentifierKind::EnumVariant => public_enum_variant_name(lang, rust_name),
PublicIdentifierKind::Function | PublicIdentifierKind::Method | PublicIdentifierKind::Field => {
public_member_name(lang, rust_name)
}
PublicIdentifierKind::Parameter => public_parameter_name(lang, rust_name),
}
}
pub fn qualified_type_path(package: &str, type_name: &str) -> String {
if package.is_empty() || type_name.contains('.') {
return type_name.to_string();
}
format!("{package}.{type_name}")
}
fn public_member_name(lang: Language, name: &str) -> String {
match lang {
Language::Python | Language::Ruby | Language::Elixir | Language::Ffi | Language::R | Language::Rust => {
name.to_snake_case()
}
Language::Go => to_go_name(name),
Language::Csharp => to_csharp_name(name),
Language::Node
| Language::Php
| Language::Wasm
| Language::Java
| Language::Kotlin
| Language::KotlinAndroid
| Language::Swift
| Language::Dart => name.to_lower_camel_case(),
Language::Gleam | Language::Zig | Language::C | Language::Jni => name.to_snake_case(),
}
}
fn public_parameter_name(lang: Language, name: &str) -> String {
match lang {
Language::Go => go_param_name(name),
_ => public_member_name(lang, name),
}
}
pub(super) fn public_type_name(lang: Language, name: &str) -> String {
match lang {
Language::Go => go_type_name(name),
Language::Csharp => csharp_type_name(name),
Language::Python
| Language::Node
| Language::Ruby
| Language::Php
| Language::Elixir
| Language::Wasm
| Language::Java
| Language::Kotlin
| Language::KotlinAndroid
| Language::Swift
| Language::Dart
| Language::Gleam
| Language::Zig
| Language::Ffi
| Language::R
| Language::Rust
| Language::C
| Language::Jni => name.to_string(),
}
}
pub(super) fn cased_pascal_type_name(lang: Language, name: &str) -> String {
match lang {
Language::Go => go_type_name(&name.to_pascal_case()),
Language::Csharp => csharp_type_name(&name.to_pascal_case()),
_ => name.to_pascal_case(),
}
}
pub fn cased_public_type_name(lang: Language, name: &str) -> String {
let converted = cased_pascal_type_name(lang, name);
escape_identifier_for(lang, &converted, IdentifierContext::PublicType)
}
fn public_enum_variant_name(lang: Language, name: &str) -> String {
match lang {
Language::Python | Language::Ffi | Language::C | Language::Java => pascal_to_screaming_snake(name),
Language::Ruby | Language::Elixir | Language::R | Language::Zig => pascal_to_snake(name),
Language::Go => go_variant_name(name),
Language::Csharp => csharp_variant_name(name),
Language::Rust
| Language::Node
| Language::Php
| Language::Wasm
| Language::Kotlin
| Language::KotlinAndroid
| Language::Swift
| Language::Dart
| Language::Gleam
| Language::Jni => pascal_to_pascal(name),
}
}
fn public_identifier_context(kind: PublicIdentifierKind) -> IdentifierContext {
match kind {
PublicIdentifierKind::Function | PublicIdentifierKind::Method | PublicIdentifierKind::Field => {
IdentifierContext::PublicMember
}
PublicIdentifierKind::Type => IdentifierContext::PublicType,
PublicIdentifierKind::EnumVariant => IdentifierContext::PublicEnumVariant,
PublicIdentifierKind::Parameter => IdentifierContext::PublicParameter,
}
}