use std::sync::{Arc, OnceLock};
use crate::runtime_resolvers::{InProcessResolver, SharedRuntimeResolver};
pub type ResolverBuildError = Box<dyn std::error::Error + Send + Sync>;
pub type ResolverFactory =
Box<dyn Fn() -> Result<SharedRuntimeResolver, ResolverBuildError> + Send + Sync>;
static FACTORY: OnceLock<ResolverFactory> = OnceLock::new();
pub fn set_resolver_factory(factory: ResolverFactory) {
if FACTORY.set(factory).is_err() {
tracing::warn!(
"set_resolver_factory called after a factory was already registered; \
subsequent registration ignored"
);
}
}
pub fn build_resolver() -> Result<SharedRuntimeResolver, ResolverBuildError> {
if let Some(factory) = FACTORY.get() {
return factory();
}
Ok(Arc::new(InProcessResolver::from_env()?))
}