use descartes_components::transport::{EndpointInfo, SharedEndpointRegistry};
use std::time::Duration;
pub async fn wait_for_endpoint(
registry: SharedEndpointRegistry,
service_name: String,
timeout: Option<Duration>,
) -> Option<EndpointInfo> {
let deadline = timeout.map(|d| descartes_tokio::time::Instant::now() + d);
loop {
if let Some(ep) = registry.get_endpoint_for_service(&service_name) {
return Some(ep);
}
match deadline {
None => {
registry.changed().await;
}
Some(d) => {
let now = descartes_tokio::time::Instant::now();
if now >= d {
return None;
}
let remaining = d.saturating_duration_since(now);
if descartes_tokio::time::timeout(remaining, registry.changed())
.await
.is_err()
{
return None;
}
}
}
}
}