use praxis_core::subrequest::SubRequestConnector;
#[cfg(feature = "policy-engine")]
pub(crate) use storage::shared_policy_connector;
#[cfg(all(test, feature = "policy-engine"))]
pub(crate) static REGISTRATION_LOCK: std::sync::Mutex<()> = std::sync::Mutex::new(());
pub fn set_policy_subrequest_connector(connector: &SubRequestConnector) {
#[cfg(feature = "policy-engine")]
storage::policy_connector().set(connector);
#[cfg(not(feature = "policy-engine"))]
let _ = connector;
}
#[cfg(feature = "policy-engine")]
#[doc(hidden)]
#[must_use]
pub fn registered_policy_subrequest_connector() -> Option<SubRequestConnector> {
shared_policy_connector()
}
#[cfg(feature = "policy-engine")]
mod storage {
use std::sync::{Arc, OnceLock};
use arc_swap::ArcSwapOption;
use praxis_core::subrequest::SubRequestConnector;
#[derive(Debug, Default)]
pub(super) struct ConnectorHolder(ArcSwapOption<SubRequestConnector>);
impl ConnectorHolder {
pub(super) fn set(&self, connector: &SubRequestConnector) {
self.0.store(Some(Arc::new(connector.clone())));
}
pub(super) fn get(&self) -> Option<SubRequestConnector> {
self.0.load_full().map(|held| held.as_ref().clone())
}
}
pub(super) fn policy_connector() -> &'static ConnectorHolder {
static POLICY_CONNECTOR: OnceLock<ConnectorHolder> = OnceLock::new();
POLICY_CONNECTOR.get_or_init(ConnectorHolder::default)
}
pub(crate) fn shared_policy_connector() -> Option<SubRequestConnector> {
policy_connector().get()
}
#[cfg(test)]
#[expect(clippy::allow_attributes, reason = "blanket test suppressions")]
#[allow(clippy::unwrap_used, clippy::expect_used, clippy::panic, reason = "tests")]
mod tests {
use super::*;
#[test]
fn a_holder_hands_back_the_connector_it_was_given() {
let holder = ConnectorHolder::default();
assert!(holder.get().is_none(), "an empty holder holds nothing");
let first = crate::test_support::connector(8, None);
holder.set(&first);
assert!(
std::ptr::eq(holder.get().expect("registered").connector(), first.connector()),
"readers see the registered pool, not a fresh one"
);
}
#[test]
fn storing_the_held_connector_again_keeps_the_same_pool() {
let holder = ConnectorHolder::default();
let held = crate::test_support::connector(8, None);
holder.set(&held);
holder.set(&held);
assert!(std::ptr::eq(
holder.get().expect("registered").connector(),
held.connector()
));
}
#[test]
fn a_second_runtimes_connector_replaces_the_first() {
let holder = ConnectorHolder::default();
let first = crate::test_support::connector(8, None);
let second = crate::test_support::connector(1, None);
holder.set(&first);
holder.set(&second);
let held = holder.get().expect("registered");
assert!(
std::ptr::eq(held.connector(), second.connector()),
"the later registration is what readers see"
);
assert!(
!std::ptr::eq(held.connector(), first.connector()),
"and it is not the earlier pool"
);
}
}
}
#[cfg(test)]
#[expect(clippy::allow_attributes, reason = "blanket test suppressions")]
#[allow(clippy::unwrap_used, clippy::expect_used, clippy::panic, reason = "tests")]
mod tests {
#[cfg(not(feature = "policy-engine"))]
#[test]
fn registering_without_the_policy_engine_is_accepted_and_stores_nothing() {
super::set_policy_subrequest_connector(&crate::test_support::connector(8, None));
super::set_policy_subrequest_connector(&crate::test_support::connector(1, None));
}
}