rosrustext_rosrs 0.2.3

rclrs adapter for rosrustext ROS 2 lifecycle + parameters parity
use std::sync::Arc;

use rclrs::{IntoPrimitiveOptions, Node, QoSProfile};

use rosrustext_core::parameters::EventRecord;

use crate::error::Result;

use super::to_ros_parameter;

pub(crate) struct ParameterEventsPublisher {
    node_name: String,
    publisher: Arc<rclrs::Publisher<rclrs::vendor::rcl_interfaces::msg::ParameterEvent>>,
}

impl ParameterEventsPublisher {
    pub(crate) fn new(node: &Arc<Node>) -> Result<Self> {
        let fqn = node.fully_qualified_name();
        let topic = format!("{}/parameter_events", fqn);
        let publisher = Arc::new(node.create_publisher::<rclrs::vendor::rcl_interfaces::msg::ParameterEvent>(
            topic.qos(QoSProfile::parameter_events_default()),
        )?);
        Ok(Self { node_name: fqn, publisher })
    }

    pub(crate) fn publish(&self, record: EventRecord) -> Result<()> {
        if record.is_empty() {
            return Ok(());
        }
        let msg = rclrs::vendor::rcl_interfaces::msg::ParameterEvent {
            node: self.node_name.clone(),
            new_parameters: record.new_parameters.into_iter().map(to_ros_parameter).collect(),
            changed_parameters: record.changed_parameters.into_iter().map(to_ros_parameter).collect(),
            deleted_parameters: record.deleted_parameters.into_iter().map(to_ros_parameter).collect(),
            ..Default::default()
        };
        self.publisher.publish(msg)?;
        Ok(())
    }

    pub(crate) fn publisher(&self) -> Arc<rclrs::Publisher<rclrs::vendor::rcl_interfaces::msg::ParameterEvent>> {
        Arc::clone(&self.publisher)
    }
}