robotrt-middleware-core 0.1.0-beta.2

RobotRT modular robotics runtime and middleware components.
Documentation
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())
    }
}