use crate::codegen::naming::csharp_type_name;
use crate::core::backend::TraitBridgeRegistrationSurface;
use crate::core::config::{ResolvedCrateConfig, TraitBridgeConfig};
use crate::core::ir::ApiSurface;
pub(crate) fn registry_class_name(trait_name: &str) -> String {
format!("{}Registry", csharp_type_name(trait_name))
}
pub(crate) fn register_method_name(trait_name: &str) -> String {
format!("Register{}", csharp_type_name(trait_name))
}
pub(crate) const UNREGISTER_METHOD: &str = "Unregister";
pub(crate) const CLEAR_METHOD: &str = "Clear";
fn is_visitor_bridge(bridge: &TraitBridgeConfig) -> bool {
bridge.context_type.is_some() && bridge.result_type.is_some()
}
pub fn registration_surface(api: &ApiSurface, config: &ResolvedCrateConfig) -> Vec<TraitBridgeRegistrationSurface> {
config
.trait_bridges
.iter()
.filter(|bridge| bridge.is_active_for("csharp"))
.filter(|bridge| !is_visitor_bridge(bridge))
.filter_map(|bridge| {
let trait_def = api.types.iter().find(|t| t.is_trait && t.name == bridge.trait_name)?;
let registry = registry_class_name(&trait_def.name);
Some(TraitBridgeRegistrationSurface {
trait_name: trait_def.name.clone(),
register_symbol: Some(format!("{registry}.{}", register_method_name(&trait_def.name))),
unregister_symbol: bridge
.unregister_fn
.as_ref()
.map(|_| format!("{registry}.{UNREGISTER_METHOD}")),
clear_symbol: bridge.clear_fn.as_ref().map(|_| format!("{registry}.{CLEAR_METHOD}")),
})
})
.collect()
}