use super::{TraitBridgeGenerator, TraitBridgeSpec};
pub fn gen_bridge_registration_fn(spec: &TraitBridgeSpec, generator: &dyn TraitBridgeGenerator) -> Option<String> {
spec.bridge_config.register_fn.as_deref()?;
Some(generator.gen_registration_fn(spec))
}
pub fn gen_bridge_unregistration_fn(spec: &TraitBridgeSpec, generator: &dyn TraitBridgeGenerator) -> Option<String> {
spec.bridge_config.unregister_fn.as_deref()?;
let body = generator.gen_unregistration_fn(spec);
if body.is_empty() { None } else { Some(body) }
}
pub fn gen_bridge_clear_fn(spec: &TraitBridgeSpec, generator: &dyn TraitBridgeGenerator) -> Option<String> {
spec.bridge_config.clear_fn.as_deref()?;
let body = generator.gen_clear_fn(spec);
if body.is_empty() { None } else { Some(body) }
}
pub fn host_function_path(spec: &TraitBridgeSpec, fn_name: &str) -> String {
if let Some(getter) = spec.bridge_config.registry_getter.as_deref() {
let last = getter.rsplit("::").next().unwrap_or("");
if let Some(sub) = last.strip_prefix("get_").and_then(|s| s.strip_suffix("_registry")) {
let prefix_end = getter.len() - last.len();
let prefix = &getter[..prefix_end];
let prefix = prefix.trim_end_matches("registry::");
return format!("{prefix}{sub}::{fn_name}");
}
}
format!("{}::plugins::{}", spec.core_import, fn_name)
}