Skip to content

Commit 7eff364

Browse files
committed
[api] add macro for parsing Capnp lists
1 parent 89d6ccf commit 7eff364

File tree

2 files changed

+28
-35
lines changed

2 files changed

+28
-35
lines changed

src/client/communicator.rs

Lines changed: 14 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ use std::net::SocketAddr;
33
use tokio_core::net::TcpStream;
44
use std::error::Error;
55
use common::rpc::new_rpc_system;
6-
use capnp::capability::Promise;
76
use capnp_rpc::rpc_twoparty_capnp;
87
use futures::Future;
98
use std::cell::Ref;
@@ -35,24 +34,16 @@ impl Communicator {
3534
let mut request = bootstrap.register_as_client_request();
3635
request.get().set_version(version);
3736

38-
let service = core.run(
39-
request
40-
.send()
41-
.promise
42-
.and_then(|response| Promise::ok(pry!(response.get()).get_service())),
43-
)??;
37+
let service = core.run(request.send().promise)?.get()?.get_service()?;
4438

4539
Ok(Self { core, service })
4640
}
4741

4842
pub fn new_session(&mut self) -> Result<i32, Box<Error>> {
49-
let id: i32 = self.core.run(
50-
self.service
51-
.new_session_request()
52-
.send()
53-
.promise
54-
.and_then(|response| Promise::ok(pry!(response.get()).get_session_id())),
55-
)?;
43+
let id: i32 = self.core
44+
.run(self.service.new_session_request().send().promise)?
45+
.get()?
46+
.get_session_id();
5647

5748
Ok(id)
5849
}
@@ -72,32 +63,31 @@ impl Communicator {
7263
{
7364
let mut req = self.service.submit_request();
7465

75-
capnplist!(req.get(), tasks, init_tasks);
76-
capnplist!(
66+
to_capnp_list!(req.get(), tasks, init_tasks);
67+
to_capnp_list!(
7768
req.get(),
7869
data_objects
7970
.iter()
8071
.map(|t| t.as_ref())
8172
.collect::<Vec<&DataObject>>(),
8273
init_objects
8374
);
84-
8575
self.core.run(req.send().promise)?;
8676

8777
Ok(())
8878
}
8979

9080
pub fn unkeep(&mut self, objects: &[DataObjectId]) -> Result<(), Box<Error>> {
9181
let mut req = self.service.unkeep_request();
92-
capnplist!(req.get(), objects, init_object_ids);
82+
to_capnp_list!(req.get(), objects, init_object_ids);
9383
self.core.run(req.send().promise)?;
9484
Ok(())
9585
}
9686

9787
pub fn wait(&mut self, tasks: &[TaskId], objects: &[DataObjectId]) -> Result<(), Box<Error>> {
9888
let mut req = self.service.wait_request();
99-
capnplist!(req.get(), tasks, init_task_ids);
100-
capnplist!(req.get(), objects, init_object_ids);
89+
to_capnp_list!(req.get(), tasks, init_task_ids);
90+
to_capnp_list!(req.get(), objects, init_object_ids);
10191
self.core.run(req.send().promise)?;
10292
Ok(())
10393
}
@@ -107,21 +97,13 @@ impl Communicator {
10797
objects: &[DataObjectId],
10898
) -> Result<(Vec<TaskId>, Vec<DataObjectId>), Box<Error>> {
10999
let mut req = self.service.wait_some_request();
110-
capnplist!(req.get(), tasks, init_task_ids);
111-
capnplist!(req.get(), objects, init_object_ids);
100+
to_capnp_list!(req.get(), tasks, init_task_ids);
101+
to_capnp_list!(req.get(), objects, init_object_ids);
112102
let res = self.core.run(req.send().promise)?;
113103

114104
Ok((
115-
res.get()?
116-
.get_finished_tasks()?
117-
.iter()
118-
.map(|id| TaskId::from_capnp(&id))
119-
.collect(),
120-
res.get()?
121-
.get_finished_objects()?
122-
.iter()
123-
.map(|id| DataObjectId::from_capnp(&id))
124-
.collect(),
105+
from_capnp_list!(res.get()?, get_finished_tasks, TaskId),
106+
from_capnp_list!(res.get()?, get_finished_objects, DataObjectId),
125107
))
126108
}
127109

src/client/rpc.rs

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use client::task::TaskInput;
44
use common::convert::ToCapnp;
55
use common::id::DataObjectId;
66

7-
macro_rules! capnplist {
7+
macro_rules! to_capnp_list {
88
($builder:expr, $items:expr, $name:ident) => {
99
{
1010
let mut builder = $builder.$name($items.len() as u32);
@@ -14,6 +14,17 @@ macro_rules! capnplist {
1414
}
1515
}
1616
}
17+
macro_rules! from_capnp_list {
18+
($builder:expr, $items:ident, $obj:ident) => {
19+
{
20+
$builder
21+
.$items()?
22+
.iter()
23+
.map(|item| $obj::from_capnp(&item))
24+
.collect()
25+
}
26+
}
27+
}
1728

1829
impl<'a> ToCapnp<'a> for TaskInput {
1930
type Builder = ::client_capnp::task::in_data_object::Builder<'a>;
@@ -36,8 +47,8 @@ impl<'a> ToCapnp<'a> for Task {
3647
self.id.to_capnp(&mut builder.reborrow().get_id().unwrap());
3748
builder.set_task_type(&self.command);
3849

39-
capnplist!(builder.reborrow(), self.inputs, init_inputs);
40-
capnplist!(
50+
to_capnp_list!(builder.reborrow(), self.inputs, init_inputs);
51+
to_capnp_list!(
4152
builder.reborrow(),
4253
self.outputs
4354
.iter()

0 commit comments

Comments
 (0)