2022-09-03 17:57:25 +00:00
|
|
|
use super::*;
|
|
|
|
|
|
|
|
/// Where to send an RPC message
|
|
|
|
#[derive(Debug, Clone)]
|
|
|
|
pub enum Destination {
|
|
|
|
/// Send to node directly
|
|
|
|
Direct {
|
|
|
|
/// The node to send to
|
|
|
|
target: NodeRef,
|
2022-10-09 18:59:01 +00:00
|
|
|
/// Require safety route or not
|
2022-10-16 23:59:59 +00:00
|
|
|
safety: Option<SafetySpec>,
|
2022-09-03 17:57:25 +00:00
|
|
|
},
|
|
|
|
/// Send to node for relay purposes
|
|
|
|
Relay {
|
|
|
|
/// The relay to send to
|
|
|
|
relay: NodeRef,
|
|
|
|
/// The final destination the relay should send to
|
|
|
|
target: DHTKey,
|
2022-10-09 18:59:01 +00:00
|
|
|
/// Require safety route or not
|
2022-10-16 23:59:59 +00:00
|
|
|
safety: Option<SafetySpec>,
|
2022-09-03 17:57:25 +00:00
|
|
|
},
|
|
|
|
/// Send to private route (privateroute)
|
|
|
|
PrivateRoute {
|
|
|
|
/// A private route to send to
|
|
|
|
private_route: PrivateRoute,
|
2022-10-09 18:59:01 +00:00
|
|
|
/// Require safety route or not
|
2022-10-16 23:59:59 +00:00
|
|
|
safety: Option<SafetySpec>,
|
2022-10-09 18:59:01 +00:00
|
|
|
/// Prefer reliability or not
|
|
|
|
reliable: bool,
|
2022-09-03 17:57:25 +00:00
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
impl Destination {
|
|
|
|
pub fn direct(target: NodeRef) -> Self {
|
|
|
|
Self::Direct {
|
|
|
|
target,
|
2022-10-16 23:59:59 +00:00
|
|
|
safety: None,
|
2022-09-03 17:57:25 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
pub fn relay(relay: NodeRef, target: DHTKey) -> Self {
|
|
|
|
Self::Relay {
|
|
|
|
relay,
|
|
|
|
target,
|
2022-10-16 23:59:59 +00:00
|
|
|
safety: None,
|
2022-09-03 17:57:25 +00:00
|
|
|
}
|
|
|
|
}
|
2022-10-09 18:59:01 +00:00
|
|
|
pub fn private_route(private_route: PrivateRoute, reliable: bool) -> Self {
|
2022-09-03 17:57:25 +00:00
|
|
|
Self::PrivateRoute {
|
|
|
|
private_route,
|
2022-10-16 23:59:59 +00:00
|
|
|
safety: None,
|
2022-10-09 18:59:01 +00:00
|
|
|
reliable,
|
2022-09-03 17:57:25 +00:00
|
|
|
}
|
|
|
|
}
|
2022-09-04 18:17:28 +00:00
|
|
|
|
2022-10-16 23:59:59 +00:00
|
|
|
pub fn with_safety(self, spec: SafetySpec) -> Self {
|
2022-09-03 17:57:25 +00:00
|
|
|
match self {
|
2022-10-09 18:59:01 +00:00
|
|
|
Destination::Direct { target, safety: _ } => Self::Direct {
|
2022-09-03 17:57:25 +00:00
|
|
|
target,
|
2022-10-16 23:59:59 +00:00
|
|
|
safety: Some(spec),
|
2022-09-03 17:57:25 +00:00
|
|
|
},
|
|
|
|
Destination::Relay {
|
|
|
|
relay,
|
|
|
|
target,
|
2022-10-09 18:59:01 +00:00
|
|
|
safety: _,
|
2022-09-03 17:57:25 +00:00
|
|
|
} => Self::Relay {
|
|
|
|
relay,
|
|
|
|
target,
|
2022-10-16 23:59:59 +00:00
|
|
|
safety: Some(spec),
|
2022-09-03 17:57:25 +00:00
|
|
|
},
|
|
|
|
Destination::PrivateRoute {
|
|
|
|
private_route,
|
2022-10-09 18:59:01 +00:00
|
|
|
safety: _,
|
|
|
|
reliable,
|
2022-09-03 17:57:25 +00:00
|
|
|
} => Self::PrivateRoute {
|
|
|
|
private_route,
|
2022-10-16 23:59:59 +00:00
|
|
|
safety: Some(spec),
|
2022-10-09 18:59:01 +00:00
|
|
|
reliable,
|
2022-09-03 17:57:25 +00:00
|
|
|
},
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl fmt::Display for Destination {
|
|
|
|
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
|
|
|
match self {
|
2022-10-09 18:59:01 +00:00
|
|
|
Destination::Direct { target, safety } => {
|
2022-10-16 23:59:59 +00:00
|
|
|
let sr = if safety.is_some() { "+SR" } else { "" };
|
2022-09-03 17:57:25 +00:00
|
|
|
|
2022-10-09 18:59:01 +00:00
|
|
|
write!(f, "{}{}", target, sr)
|
2022-09-03 17:57:25 +00:00
|
|
|
}
|
|
|
|
Destination::Relay {
|
|
|
|
relay,
|
|
|
|
target,
|
2022-10-09 18:59:01 +00:00
|
|
|
safety,
|
2022-09-03 17:57:25 +00:00
|
|
|
} => {
|
2022-10-16 23:59:59 +00:00
|
|
|
let sr = if safety.is_some() { "+SR" } else { "" };
|
2022-09-03 17:57:25 +00:00
|
|
|
|
2022-10-09 18:59:01 +00:00
|
|
|
write!(f, "{}@{}{}", target.encode(), relay, sr)
|
2022-09-03 17:57:25 +00:00
|
|
|
}
|
|
|
|
Destination::PrivateRoute {
|
|
|
|
private_route,
|
2022-10-09 18:59:01 +00:00
|
|
|
safety,
|
|
|
|
reliable,
|
2022-09-03 17:57:25 +00:00
|
|
|
} => {
|
2022-10-16 23:59:59 +00:00
|
|
|
let sr = if safety.is_some() { "+SR" } else { "" };
|
2022-10-09 18:59:01 +00:00
|
|
|
let rl = if *reliable { "+RL" } else { "" };
|
2022-09-03 17:57:25 +00:00
|
|
|
|
2022-10-09 18:59:01 +00:00
|
|
|
write!(f, "{}{}{}", private_route, sr, rl)
|
2022-09-03 17:57:25 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|