Skip to main content

hyperstack_interpreter/
runtime_resolvers_factory.rs

1use std::sync::{Arc, OnceLock};
2
3use crate::runtime_resolvers::{InProcessResolver, SharedRuntimeResolver};
4
5pub type ResolverBuildError = Box<dyn std::error::Error + Send + Sync>;
6pub type ResolverFactory =
7    Box<dyn Fn() -> Result<SharedRuntimeResolver, ResolverBuildError> + Send + Sync>;
8
9static FACTORY: OnceLock<ResolverFactory> = OnceLock::new();
10
11/// Register a custom resolver factory. Intended for closed-source backends
12/// (e.g. a remote gRPC resolver) to inject themselves before server startup.
13///
14/// Only the first call takes effect; subsequent calls are ignored.
15pub fn set_resolver_factory(factory: ResolverFactory) {
16    if FACTORY.set(factory).is_err() {
17        tracing::warn!(
18            "set_resolver_factory called after a factory was already registered; \
19             subsequent registration ignored"
20        );
21    }
22}
23
24/// Build the runtime resolver. Uses the registered factory if set, otherwise
25/// falls back to `InProcessResolver::from_env()`.
26pub fn build_resolver() -> Result<SharedRuntimeResolver, ResolverBuildError> {
27    if let Some(factory) = FACTORY.get() {
28        return factory();
29    }
30    Ok(Arc::new(InProcessResolver::from_env()?))
31}