use roslibrust_common::RosMessageType;
mod ros1 {
roslibrust_codegen_macro::find_and_generate_ros_messages!("assets/ros1_common_interfaces");
}
mod ros2 {
roslibrust_codegen_macro::find_and_generate_ros_messages_without_ros_package_path!(
"assets/ros2_common_interfaces",
"assets/ros2_required_msgs/rcl_interfaces/builtin_interfaces"
);
}
#[derive(serde::Serialize, serde::Deserialize, Clone, Debug)]
#[serde(untagged)]
enum GenericHeader {
V1(ros1::std_msgs::Header),
V2(ros2::std_msgs::Header),
}
impl RosMessageType for GenericHeader {
const ROS_TYPE_NAME: &'static str = "std_msgs/Header";
const MD5SUM: &'static str = "*";
const DEFINITION: &'static str = "";
}
#[cfg(feature = "rosbridge")]
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
use log::*;
env_logger::init();
let client = roslibrust::rosbridge::ClientHandle::new("ws://localhost:9090").await?;
info!("ClientHandle connected");
let rx = client.subscribe::<GenericHeader>("talker").await?;
info!("Successfully subscribed to topic: talker");
loop {
let msg = rx.next().await;
match msg {
GenericHeader::V1(ros1_header) => {
info!("Got ros1: {ros1_header:?}");
}
GenericHeader::V2(ros2_header) => {
info!("Got ros2: {ros2_header:?}");
}
}
}
}
#[cfg(not(feature = "rosbridge"))]
fn main() {
eprintln!("This example does nothing without compiling with the feature 'rosbridge'");
}