use core_types::TransportDomain;
use transport_core::{Endpoint, EndpointScheme};
use super::{LocalFirstRouteResolver, RouteHint, RouteResolver};
impl RouteResolver for LocalFirstRouteResolver {
fn resolve(&self, endpoints: &[Endpoint], hint: &RouteHint) -> Option<Endpoint> {
let with_labels = if hint.labels.is_empty() {
None
} else {
endpoints.iter().find(|ep| {
hint.labels
.iter()
.all(|label| ep.labels.iter().any(|existing| existing == label))
})
};
let preferred_by_domain =
endpoints
.iter()
.find(|ep| {
matches!(
(hint.preferred_domain, &ep.scheme),
(
TransportDomain::Local,
EndpointScheme::Ipc | EndpointScheme::SharedMemory,
) | (
TransportDomain::Network,
EndpointScheme::Udp | EndpointScheme::Tcp | EndpointScheme::Quic,
)
)
});
with_labels
.cloned()
.or_else(|| preferred_by_domain.cloned())
.or_else(|| endpoints.first().cloned())
}
}