use crate::{
builtin_interfaces, edgefirst_msgs, foxglove_msgs, geometry_msgs, nav_msgs, sensor_msgs,
std_msgs,
};
pub trait SchemaType {
const SCHEMA_NAME: &'static str;
fn schema_name() -> &'static str {
Self::SCHEMA_NAME
}
}
pub fn parse_schema(schema: &str) -> Option<(&str, &str)> {
let parts: Vec<&str> = schema.split('/').collect();
if parts.len() == 3 && parts[1] == "msg" {
Some((parts[0], parts[2]))
} else {
None
}
}
pub fn is_supported(schema: &str) -> bool {
let Some((package, type_name)) = parse_schema(schema) else {
return false;
};
match package {
"builtin_interfaces" => builtin_interfaces::is_type_supported(type_name),
"std_msgs" => std_msgs::is_type_supported(type_name),
"geometry_msgs" => geometry_msgs::is_type_supported(type_name),
"nav_msgs" => nav_msgs::is_type_supported(type_name),
"sensor_msgs" => sensor_msgs::is_type_supported(type_name),
"foxglove_msgs" => foxglove_msgs::is_type_supported(type_name),
"edgefirst_msgs" => edgefirst_msgs::is_type_supported(type_name),
_ => false,
}
}
pub fn list_schemas() -> Vec<&'static str> {
let mut schemas = Vec::new();
schemas.extend(builtin_interfaces::list_types().iter().copied());
schemas.extend(std_msgs::list_types().iter().copied());
schemas.extend(geometry_msgs::list_types().iter().copied());
schemas.extend(nav_msgs::list_types().iter().copied());
schemas.extend(sensor_msgs::list_types().iter().copied());
schemas.extend(foxglove_msgs::list_types().iter().copied());
schemas.extend(edgefirst_msgs::list_types().iter().copied());
schemas
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_parse_schema_valid() {
let (pkg, typ) = parse_schema("sensor_msgs/msg/Image").unwrap();
assert_eq!(pkg, "sensor_msgs");
assert_eq!(typ, "Image");
}
#[test]
fn test_parse_schema_invalid() {
assert!(parse_schema("invalid").is_none());
assert!(parse_schema("sensor_msgs/srv/Image").is_none());
assert!(parse_schema("sensor_msgs/Image").is_none());
}
#[test]
fn test_schema_name_trait() {
assert_eq!(
sensor_msgs::NavSatStatus::SCHEMA_NAME,
"sensor_msgs/msg/NavSatStatus"
);
assert_eq!(geometry_msgs::Pose::SCHEMA_NAME, "geometry_msgs/msg/Pose");
assert_eq!(edgefirst_msgs::Date::SCHEMA_NAME, "edgefirst_msgs/msg/Date");
}
#[test]
fn test_schema_name_method() {
assert_eq!(
sensor_msgs::NavSatStatus::schema_name(),
"sensor_msgs/msg/NavSatStatus"
);
}
#[test]
fn test_is_supported() {
assert!(is_supported("sensor_msgs/msg/Image"));
assert!(is_supported("geometry_msgs/msg/Pose"));
assert!(is_supported("edgefirst_msgs/msg/Box"));
assert!(is_supported("foxglove_msgs/msg/CompressedVideo"));
assert!(!is_supported("unknown_msgs/msg/Foo"));
assert!(!is_supported("sensor_msgs/Image")); }
#[test]
fn test_list_schemas() {
let schemas = list_schemas();
assert!(schemas.contains(&"sensor_msgs/msg/Image"));
assert!(schemas.contains(&"geometry_msgs/msg/Pose"));
assert!(schemas.contains(&"edgefirst_msgs/msg/Box"));
assert!(!schemas.contains(&"unknown_msgs/msg/Foo"));
}
}