use actr_protocol::ActrId;
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub enum Dest {
Host,
Workload,
Peer(ActrId),
}
impl Dest {
#[inline]
pub fn host() -> Self {
Dest::Host
}
#[inline]
pub fn workload() -> Self {
Dest::Workload
}
#[inline]
pub fn peer(id: ActrId) -> Self {
Dest::Peer(id)
}
#[inline]
pub fn is_host(&self) -> bool {
matches!(self, Dest::Host)
}
#[inline]
pub fn is_workload(&self) -> bool {
matches!(self, Dest::Workload)
}
#[inline]
pub fn is_peer(&self) -> bool {
matches!(self, Dest::Peer(_))
}
#[inline]
pub fn as_peer_id(&self) -> Option<&ActrId> {
match self {
Dest::Peer(id) => Some(id),
_ => None,
}
}
}
impl From<ActrId> for Dest {
#[inline]
fn from(id: ActrId) -> Self {
Dest::Peer(id)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_dest_creation() {
let host_dest = Dest::host();
assert!(host_dest.is_host());
assert!(!host_dest.is_workload());
assert!(!host_dest.is_peer());
let workload_dest = Dest::workload();
assert!(!workload_dest.is_host());
assert!(workload_dest.is_workload());
assert!(!workload_dest.is_peer());
let id = ActrId::default();
let peer_dest = Dest::peer(id);
assert!(!peer_dest.is_host());
assert!(!peer_dest.is_workload());
assert!(peer_dest.is_peer());
}
#[test]
fn test_dest_hash() {
use std::collections::HashMap;
let id1 = ActrId::default();
let id2 = ActrId {
serial_number: 1,
..Default::default()
};
let mut map = HashMap::new();
map.insert(Dest::host(), "host");
map.insert(Dest::workload(), "workload");
map.insert(Dest::peer(id1), "peer1");
map.insert(Dest::peer(id2), "peer2");
assert_eq!(map.len(), 4);
}
#[test]
fn test_dest_as_peer_id() {
let host_dest = Dest::host();
assert_eq!(host_dest.as_peer_id(), None);
let workload_dest = Dest::workload();
assert_eq!(workload_dest.as_peer_id(), None);
let id = ActrId {
serial_number: 7,
..Default::default()
};
let peer_dest = Dest::peer(id.clone());
assert_eq!(peer_dest.as_peer_id(), Some(&id));
}
#[test]
fn test_dest_from_actr_id() {
let id = ActrId::default();
let dest: Dest = id.clone().into();
assert_eq!(dest, Dest::Peer(id));
}
}