use crate::codegen::c_consumer;
use crate::codegen::naming::pascal_to_snake;
pub(crate) fn free_function_symbol(ffi_prefix: &str, function_name: &str) -> String {
c_consumer::free_function_symbol(ffi_prefix, function_name)
}
pub(crate) fn method_symbol(ffi_prefix: &str, type_name: &str, method_name: &str) -> String {
c_consumer::method_symbol(ffi_prefix, type_name, method_name)
}
pub(crate) fn stream_adapter_symbol(ffi_prefix: &str, owner_type: &str, adapter_name: &str, operation: &str) -> String {
c_consumer::stream_adapter_symbol(ffi_prefix, owner_type, adapter_name, operation)
}
pub(crate) fn service_new_symbol(ffi_prefix: &str, service_name: &str) -> String {
c_consumer::service_new_symbol(ffi_prefix, service_name)
}
pub(crate) fn service_free_symbol(ffi_prefix: &str, service_name: &str) -> String {
c_consumer::service_free_symbol(ffi_prefix, service_name)
}
pub(crate) fn service_register_symbol(ffi_prefix: &str, service_name: &str, method_name: &str) -> String {
c_consumer::service_register_symbol(ffi_prefix, service_name, method_name)
}
pub(crate) fn service_method_symbol(ffi_prefix: &str, service_name: &str, method_name: &str) -> String {
c_consumer::service_method_symbol(ffi_prefix, service_name, method_name)
}
pub(crate) fn service_entrypoint_symbol(ffi_prefix: &str, service_name: &str, method_name: &str) -> String {
c_consumer::service_entrypoint_symbol(ffi_prefix, service_name, method_name)
}
pub(crate) fn trait_register_symbol(ffi_prefix: &str, register_fn: &str) -> String {
c_consumer::trait_register_symbol(ffi_prefix, register_fn)
}
pub(crate) fn trait_unregister_symbol(ffi_prefix: &str, trait_name: &str) -> String {
c_consumer::trait_unregister_symbol(ffi_prefix, trait_name)
}
pub(crate) fn trait_clear_symbol(ffi_prefix: &str, trait_name: &str) -> String {
c_consumer::trait_clear_symbol(ffi_prefix, trait_name)
}
pub(crate) fn go_vtable_constructor_symbol(ffi_prefix: &str, trait_name: &str) -> String {
format!("{ffi_prefix}_{}_vtable_new", heck::AsSnakeCase(trait_name))
}
pub(crate) fn type_component(type_name: &str) -> String {
pascal_to_snake(type_name)
}
#[cfg(test)]
mod tests {
use super::*;
const ADVERSARIAL_TYPE_NAMES: &[&str] = &[
"HTTPServer",
"URLPath",
"UTF8Length",
"Base64Encode",
"_Internal",
"AClient",
"JSONLD",
"already_snake",
];
const ADVERSARIAL_METHOD_NAMES: &[&str] = &[
"parseURLPath",
"utf8Length",
"Base64Encode",
"_hidden",
"a",
"to_json",
"parse__inner",
];
#[test]
fn type_component_matches_the_symbol_helper() {
for type_name in ADVERSARIAL_TYPE_NAMES {
assert_eq!(
method_symbol("p", type_name, "m"),
format!("p_{}_m", type_component(type_name)),
"`{type_name}` component drifted from the symbol helper"
);
}
}
#[test]
fn adversarial_rows_discriminate_against_the_heck_derivation() {
use heck::ToSnakeCase;
let divergent_methods: Vec<&str> = ADVERSARIAL_METHOD_NAMES
.iter()
.copied()
.filter(|name| *name != name.to_snake_case())
.collect();
assert_eq!(
divergent_methods,
vec!["parseURLPath", "utf8Length", "Base64Encode", "_hidden", "parse__inner"],
"the method rows that discriminate against heck changed"
);
let divergent_types: Vec<&str> = ADVERSARIAL_TYPE_NAMES
.iter()
.copied()
.filter(|name| type_component(name) != name.to_snake_case())
.collect();
assert_eq!(
divergent_types,
vec!["_Internal"],
"the type rows that discriminate against heck changed"
);
}
}