middleware_core/route/
local_first.rs1use core_types::TransportDomain;
2use transport_core::{Endpoint, EndpointScheme};
3
4use super::{LocalFirstRouteResolver, RouteHint, RouteResolver};
5
6impl RouteResolver for LocalFirstRouteResolver {
7 fn resolve(&self, endpoints: &[Endpoint], hint: &RouteHint) -> Option<Endpoint> {
8 let with_labels = if hint.labels.is_empty() {
9 None
10 } else {
11 endpoints.iter().find(|ep| {
12 hint.labels
13 .iter()
14 .all(|label| ep.labels.iter().any(|existing| existing == label))
15 })
16 };
17
18 let preferred_by_domain =
19 endpoints
20 .iter()
21 .find(|ep| {
22 matches!(
23 (hint.preferred_domain, &ep.scheme),
24 (
25 TransportDomain::Local,
26 EndpointScheme::Ipc | EndpointScheme::SharedMemory,
27 ) | (
28 TransportDomain::Network,
29 EndpointScheme::Udp | EndpointScheme::Tcp | EndpointScheme::Quic,
30 )
31 )
32 });
33
34 with_labels
35 .cloned()
36 .or_else(|| preferred_by_domain.cloned())
37 .or_else(|| endpoints.first().cloned())
38 }
39}