use super::{TraitBridgeGenerator, TraitBridgeSpec};
use crate::core::config::TraitBridgeConfig;
pub fn gen_bridge_registration_fn(spec: &TraitBridgeSpec, generator: &dyn TraitBridgeGenerator) -> Option<String> {
if let Some(code) = super::generator::disabled_code(generator) {
return Some(code);
}
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> {
if let Some(code) = super::generator::disabled_code(generator) {
return Some(code);
}
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> {
if let Some(code) = super::generator::disabled_code(generator) {
return Some(code);
}
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 {
host_function_path_for_config(spec.bridge_config, spec.core_import, fn_name)
}
pub(crate) fn host_function_path_for_config(
bridge_config: &TraitBridgeConfig,
core_import: &str,
fn_name: &str,
) -> String {
if let Some(getter) = 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!("{core_import}::plugins::{fn_name}")
}