use crate::name::is_fully_qualified;
use crate::typehash::{dds_type_name, TypeHash};
use alloc::format;
use alloc::string::String;
pub fn entity_key(domain_id: u32, fqn: &str, ros_type: &str, hash: &TypeHash) -> Option<String> {
if !is_fully_qualified(fqn) {
return None;
}
let type_name = dds_type_name(ros_type)?;
let key = format!("{domain_id}{fqn}/{type_name}/{hash}");
if pamoja_zenoh::keyexpr::is_valid(&key) {
Some(key)
} else {
None
}
}
#[cfg(test)]
mod tests {
use super::*;
fn hash(text: &str) -> TypeHash {
TypeHash::parse(text).unwrap()
}
#[test]
fn matches_the_published_topic_key() {
let h = hash("RIHS01_df668c740482bbd48fb39d76a70dfd4bd59db1288021743503259e948f6b1a18");
let key = entity_key(0, "/chatter", "std_msgs/msg/String", &h).unwrap();
assert_eq!(
key,
"0/chatter/std_msgs::msg::dds_::String_/RIHS01_df668c740482bbd48fb39d76a70dfd4bd59db1288021743503259e948f6b1a18",
);
}
#[test]
fn matches_the_published_namespaced_key() {
let h = hash("RIHS01_df668c740482bbd48fb39d76a70dfd4bd59db1288021743503259e948f6b1a18");
let key = entity_key(0, "/robot1/chatter", "std_msgs/msg/String", &h).unwrap();
assert_eq!(
key,
"0/robot1/chatter/std_msgs::msg::dds_::String_/RIHS01_df668c740482bbd48fb39d76a70dfd4bd59db1288021743503259e948f6b1a18",
);
}
#[test]
fn matches_the_published_service_key() {
let h = hash("RIHS01_e118de6bf5eeb66a2491b5bda11202e7b68f198d6f67922cf30364858239c81a");
let key = entity_key(2, "/add_two_ints", "example_interfaces/srv/AddTwoInts", &h).unwrap();
assert_eq!(
key,
"2/add_two_ints/example_interfaces::srv::dds_::AddTwoInts_/RIHS01_e118de6bf5eeb66a2491b5bda11202e7b68f198d6f67922cf30364858239c81a",
);
}
#[test]
fn rejects_bad_inputs() {
let h = hash("RIHS01_df668c740482bbd48fb39d76a70dfd4bd59db1288021743503259e948f6b1a18");
assert!(entity_key(0, "chatter", "std_msgs/msg/String", &h).is_none()); assert!(entity_key(0, "/chatter", "std_msgs/String", &h).is_none()); }
}