pub fn split_wire_identifier(node_identifier: &str) -> (&str, Option<&str>, Option<&str>) {
let (rest, camera_id) = match node_identifier.rsplit_once('#') {
Some((rest, camera_id)) => (rest, Some(camera_id)),
None => (node_identifier, None),
};
let (base, instance_id) = match rest.split_once("::") {
Some((base, instance_id)) => (base, Some(instance_id)),
None => (rest, None),
};
(base, instance_id, camera_id)
}
pub fn short_name(name: &str) -> &str {
name.rsplit('/').next().unwrap_or(name)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn split_wire_identifier_leaves_a_plain_identifier_untouched() {
assert_eq!(
split_wire_identifier("@mecha10/speaker"),
("@mecha10/speaker", None, None)
);
}
#[test]
fn split_wire_identifier_splits_an_encoded_instance_id() {
assert_eq!(
split_wire_identifier("@mecha10/camera::real"),
("@mecha10/camera", Some("real"), None)
);
}
#[test]
fn split_wire_identifier_splits_a_camera_id_with_no_instance_id() {
assert_eq!(
split_wire_identifier("@mecha10/video-streamer#camera"),
("@mecha10/video-streamer", None, Some("camera"))
);
}
#[test]
fn split_wire_identifier_splits_both_instance_id_and_camera_id() {
assert_eq!(
split_wire_identifier("@mecha10/video-streamer::sim-streamer#simulation_camera"),
(
"@mecha10/video-streamer",
Some("sim-streamer"),
Some("simulation_camera")
)
);
}
#[test]
fn short_name_strips_the_scope_namespace() {
assert_eq!(short_name("@mecha10/camera"), "camera");
}
#[test]
fn short_name_leaves_an_unscoped_name_untouched() {
assert_eq!(short_name("my-node"), "my-node");
}
}