pub use hiroz_protocol::entity::*;
use zenoh::{Result, key_expr::KeyExpr};
pub const ADMIN_SPACE: &str = "@ros2_lv";
type NodeName = String;
type NodeNamespace = String;
pub type NodeKey = (NodeNamespace, NodeName);
pub type Topic = String;
pub fn normalize_node_namespace(namespace: &str) -> String {
if namespace == "/" {
String::new()
} else {
namespace.to_owned()
}
}
pub fn node_key(entity: &NodeEntity) -> NodeKey {
(
normalize_node_namespace(&entity.namespace),
entity.name.clone(),
)
}
pub fn node_lv_token_key_expr(entity: &NodeEntity) -> Result<KeyExpr<'static>> {
let ke = node_to_liveliness_ke(entity)?;
Ok(ke.0)
}
pub fn endpoint_gid(entity: &EndpointEntity) -> Option<crate::attachment::GidArray> {
use sha2::Digest;
let node = entity.node.as_ref()?;
let mut hasher = sha2::Sha256::new();
hasher.update(node.z_id.to_le_bytes());
hasher.update(entity.id.to_le_bytes());
let hash = hasher.finalize();
let mut gid = [0u8; 16];
gid.copy_from_slice(&hash[..16]);
Some(gid)
}
pub fn node_to_liveliness_ke(entity: &NodeEntity) -> Result<LivelinessKE> {
let format = hiroz_protocol::KeyExprFormat::default();
format.node_liveliness_key_expr(entity)
}
pub fn endpoint_to_liveliness_ke(entity: &EndpointEntity) -> Result<LivelinessKE> {
let format = hiroz_protocol::KeyExprFormat::default();
let Some(node) = entity.node.as_ref() else {
return Err(zenoh::Error::from(
"endpoint liveliness requires node identity",
));
};
format.liveliness_key_expr(entity, &node.z_id)
}
pub fn entity_to_liveliness_ke(entity: &Entity) -> Result<LivelinessKE> {
match entity {
Entity::Node(n) => node_to_liveliness_ke(n),
Entity::Endpoint(e) => endpoint_to_liveliness_ke(e),
}
}
pub fn entity_kind(entity: &Entity) -> EntityKind {
match entity {
Entity::Node(_) => EntityKind::Node,
Entity::Endpoint(e) => e.entity_kind(),
}
}
pub fn entity_get_endpoint(entity: &Entity) -> Option<&EndpointEntity> {
match entity {
Entity::Node(_) => None,
Entity::Endpoint(e) => Some(e),
}
}