Skip to main content

middleware_core/route/
local_first.rs

1use 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}