use hiroz::{Builder, Result, context::ZContext};
use hiroz_msgs::example_interfaces::{AddTwoIntsResponse, srv::AddTwoInts};
pub fn run_add_two_ints_server(ctx: ZContext, max_requests: Option<usize>) -> Result<()> {
let node = ctx.create_node("add_two_ints_server").build()?;
let mut service = node.create_service::<AddTwoInts>("add_two_ints").build()?;
println!("AddTwoInts service server started, waiting for requests...");
let mut request_count = 0;
loop {
let req = service.take_request()?;
println!(
"Incoming request\na: {} b: {}",
req.message().a,
req.message().b
);
let sum = req.message().a + req.message().b;
let resp = AddTwoIntsResponse { sum };
println!("Sending response: {}", resp.sum);
req.reply_blocking(&resp)?;
request_count += 1;
if let Some(max) = max_requests
&& request_count >= max
{
break;
}
}
Ok(())
}
#[cfg(not(any(test, doctest)))]
fn main() -> Result<()> {
use clap::Parser;
use hiroz::context::ZContextBuilder;
let args = Args::parse();
zenoh::init_log_from_env_or("error");
let mut builder = ZContextBuilder::default();
if let Some(e) = args.endpoint {
builder = builder.with_connect_endpoints([e]);
} else {
builder = builder.with_connect_endpoints(["tcp/127.0.0.1:7447"]);
}
let ctx = builder.build()?;
let max_requests = if args.count == 0 {
None
} else {
Some(args.count)
};
run_add_two_ints_server(ctx, max_requests)
}
#[cfg(not(any(test, doctest)))]
#[derive(Debug, clap::Parser)]
#[command(
name = "demo_nodes_add_two_ints_server",
about = "ROS 2 demo add_two_ints server node - provides addition service"
)]
struct Args {
#[arg(short, long, default_value = "0")]
count: usize,
#[arg(short, long, default_value = "peer")]
mode: String,
#[arg(short, long)]
endpoint: Option<String>,
}