1use core_types::TransportDomain;
2use transport_core::{Endpoint, EndpointScheme};
3
4mod local_first;
5mod rules;
6mod selection;
7
8pub use rules::resolve_with_rules;
9
10#[derive(Clone, Copy, Debug, Eq, PartialEq)]
11pub enum RouteTrafficKind {
12 Topic,
13 Service,
14 Action,
15 Mission,
16}
17
18#[derive(Clone, Debug, Eq, PartialEq)]
19pub struct RouteHint {
20 pub preferred_domain: TransportDomain,
21 pub labels: Vec<String>,
22 pub target_name: Option<String>,
23 pub traffic_kind: Option<RouteTrafficKind>,
24}
25
26impl Default for RouteHint {
27 fn default() -> Self {
28 Self {
29 preferred_domain: TransportDomain::Local,
30 labels: Vec::new(),
31 target_name: None,
32 traffic_kind: None,
33 }
34 }
35}
36
37pub trait RouteResolver {
38 fn resolve(&self, endpoints: &[Endpoint], hint: &RouteHint) -> Option<Endpoint>;
39}
40
41#[derive(Clone, Debug, Eq, PartialEq)]
42pub struct RouteRule {
43 pub name: String,
44 pub preferred_domain: Option<TransportDomain>,
45 pub required_labels: Vec<String>,
46 pub preferred_schemes: Vec<EndpointScheme>,
47 pub name_patterns: Vec<String>,
48 pub match_kinds: Vec<RouteTrafficKind>,
49}
50
51impl RouteRule {}
52
53#[derive(Default)]
54pub struct LocalFirstRouteResolver;