use crate::core::backend::TraitBridgeRegistrationSurface;
use crate::core::config::ResolvedCrateConfig;
use crate::core::ir::ApiSurface;
use heck::ToPascalCase;
pub(crate) fn register_fn_name(trait_name: &str) -> String {
format!("Register{trait_name}")
}
pub(crate) fn unregister_fn_name(trait_name: &str) -> String {
format!("Unregister{trait_name}")
}
pub(crate) fn configured_unregister_fn_name(unregister_fn: &str) -> String {
unregister_fn.to_pascal_case()
}
pub(crate) fn clear_fn_name(clear_fn: &str) -> String {
clear_fn.to_pascal_case()
}
pub fn registration_surface(api: &ApiSurface, config: &ResolvedCrateConfig) -> Vec<TraitBridgeRegistrationSurface> {
if !config.trait_bridges.iter().any(|bridge| bridge.register_fn.is_some()) {
return Vec::new();
}
config
.trait_bridges
.iter()
.filter(|bridge| bridge.is_active_for("go"))
.filter_map(|bridge| {
let trait_def = api.types.iter().find(|t| t.name == bridge.trait_name)?;
Some(TraitBridgeRegistrationSurface {
trait_name: trait_def.name.clone(),
register_symbol: Some(register_fn_name(&trait_def.name)),
unregister_symbol: Some(unregister_fn_name(&trait_def.name)),
clear_symbol: bridge.clear_fn.as_deref().map(clear_fn_name),
})
})
.collect()
}