Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion rclrs/src/node/client.rs
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,9 @@ type RequestValue<Response> = Box<dyn FnOnce(Response) + 'static + Send>;
type RequestId = i64;

/// Main class responsible for sending requests to a ROS service.
///
/// The only available way to instantiate clients is via [`Node::create_client`], this is to
/// ensure that [`Node`]s can track all the clients that have been created.
pub struct Client<T>
where
T: rosidl_runtime_rs::Service,
Expand All @@ -70,7 +73,9 @@ where
T: rosidl_runtime_rs::Service,
{
/// Creates a new client.
pub fn new(node: &Node, topic: &str) -> Result<Self, RclrsError>
pub(crate) fn new(node: &Node, topic: &str) -> Result<Self, RclrsError>
// This uses pub(crate) visibility to avoid instantiating this struct outside
// [`Node::create_client`], see the struct's documentation for the rationale
where
T: rosidl_runtime_rs::Service,
{
Expand Down
7 changes: 6 additions & 1 deletion rclrs/src/node/service.rs
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,9 @@ type ServiceCallback<Request, Response> =
Box<dyn Fn(&rmw_request_id_t, Request) -> Response + 'static + Send>;

/// Main class responsible for responding to requests sent by ROS clients.
///
/// The only available way to instantiate services is via [`Node::create_service`], this is to
/// ensure that [`Node`]s can track all the services that have been created.
pub struct Service<T>
where
T: rosidl_runtime_rs::Service,
Expand All @@ -69,7 +72,9 @@ where
T: rosidl_runtime_rs::Service,
{
/// Creates a new service.
pub fn new<F>(node: &Node, topic: &str, callback: F) -> Result<Self, RclrsError>
pub(crate) fn new<F>(node: &Node, topic: &str, callback: F) -> Result<Self, RclrsError>
// This uses pub(crate) visibility to avoid instantiating this struct outside
// [`Node::create_service`], see the struct's documentation for the rationale
where
T: rosidl_runtime_rs::Service,
F: Fn(&rmw_request_id_t, T::Request) -> T::Response + 'static + Send,
Expand Down
14 changes: 9 additions & 5 deletions rclrs/src/node/subscription.rs
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,9 @@ pub trait SubscriptionBase: Send + Sync {
/// When a subscription is created, it may take some time to get "matched" with a corresponding
/// publisher.
///
/// The only available way to instantiate subscriptions is via [`Node::create_subscription`], this
/// is to ensure that [`Node`]s can track all the subscriptions that have been created.
///
/// [1]: crate::spin_once
/// [2]: crate::spin
pub struct Subscription<T>
Expand All @@ -76,12 +79,14 @@ where
T: Message,
{
/// Creates a new subscription.
pub fn new<F>(
pub(crate) fn new<F>(
node: &Node,
topic: &str,
qos: QoSProfile,
callback: F,
) -> Result<Self, RclrsError>
// This uses pub(crate) visibility to avoid instantiating this struct outside
// [`Node::create_subscription`], see the struct's documentation for the rationale
where
T: Message,
F: FnMut(T) + 'static + Send,
Expand Down Expand Up @@ -213,15 +218,14 @@ where
#[cfg(test)]
mod tests {
use super::*;
use crate::{create_node, Context, Subscription, QOS_PROFILE_DEFAULT};
use crate::{create_node, Context, QOS_PROFILE_DEFAULT};

#[test]
fn test_instantiate_subscriber() -> Result<(), RclrsError> {
let context =
Context::new(vec![]).expect("Context instantiation is expected to be a success");
let node = create_node(&context, "test_new_subscriber")?;
let _subscriber = Subscription::<std_msgs::msg::String>::new(
&node,
let mut node = create_node(&context, "test_new_subscriber")?;
let _subscriber = node.create_subscription::<std_msgs::msg::String, _>(
"test",
QOS_PROFILE_DEFAULT,
move |_: std_msgs::msg::String| {},
Expand Down