mod bridge_function;
mod generator;
mod interfaces;
pub use crate::codegen::generators::trait_bridge::find_bridge_param;
pub use bridge_function::gen_bridge_function;
pub use generator::{PhpBridgeGenerator, gen_trait_bridge};
pub use interfaces::{gen_registration_interface, gen_visitor_interface, visitor_interface_class_name};
use crate::core::config::{Language, ResolvedCrateConfig, TraitBridgeConfig};
use crate::core::ir::{ApiSurface, TypeDef};
pub(crate) const DISABLED_MESSAGE: &str = "PHP callback bridges are disabled because Zend values are request-thread-bound and cannot safely implement Send or Sync; exclude PHP from this bridge";
pub(crate) fn disabled_code() -> String {
format!("compile_error!({DISABLED_MESSAGE:?});")
}
const TARGET_SPELLINGS: [&str; 1] = ["php"];
pub fn targets_php(bridge: &TraitBridgeConfig) -> bool {
crate::codegen::generators::trait_bridge::bridge_targets_language(bridge, &TARGET_SPELLINGS)
}
pub fn active_bridges(config: &ResolvedCrateConfig) -> impl Iterator<Item = &TraitBridgeConfig> {
config.trait_bridges_for(Language::Php)
}
pub(crate) fn reject_unsafe_bridges(config: &ResolvedCrateConfig) -> anyhow::Result<()> {
for bridge in active_bridges(config) {
if !bridge.php_callbacks_unsupported() {
anyhow::bail!(bridge.php_safety_error());
}
if let Some(error) = bridge.php_lifecycle_only_error() {
anyhow::bail!(error);
}
}
Ok(())
}
pub fn active_bridge_trait<'a>(bridge: &TraitBridgeConfig, api: &'a ApiSurface) -> Option<&'a TypeDef> {
crate::codegen::generators::trait_bridge::active_bridge_trait_def(bridge, api, &TARGET_SPELLINGS)
}