Skip to content

Commit

Permalink
[api] add macro for parsing Capnp lists
Browse files Browse the repository at this point in the history
  • Loading branch information
Kobzol committed May 4, 2018
1 parent fe4e504 commit 261ee87
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 35 deletions.
46 changes: 14 additions & 32 deletions src/client/communicator.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ use std::net::SocketAddr;
use tokio_core::net::TcpStream;
use std::error::Error;
use common::rpc::new_rpc_system;
use capnp::capability::Promise;
use capnp_rpc::rpc_twoparty_capnp;
use futures::Future;
use std::cell::Ref;
Expand Down Expand Up @@ -35,24 +34,16 @@ impl Communicator {
let mut request = bootstrap.register_as_client_request();
request.get().set_version(version);

let service = core.run(
request
.send()
.promise
.and_then(|response| Promise::ok(pry!(response.get()).get_service())),
)??;
let service = core.run(request.send().promise)?.get()?.get_service()?;

Ok(Self { core, service })
}

pub fn new_session(&mut self) -> Result<i32, Box<Error>> {
let id: i32 = self.core.run(
self.service
.new_session_request()
.send()
.promise
.and_then(|response| Promise::ok(pry!(response.get()).get_session_id())),
)?;
let id: i32 = self.core
.run(self.service.new_session_request().send().promise)?
.get()?
.get_session_id();

Ok(id)
}
Expand All @@ -72,32 +63,31 @@ impl Communicator {
{
let mut req = self.service.submit_request();

capnplist!(req.get(), tasks, init_tasks);
capnplist!(
to_capnp_list!(req.get(), tasks, init_tasks);
to_capnp_list!(
req.get(),
data_objects
.iter()
.map(|t| t.as_ref())
.collect::<Vec<&DataObject>>(),
init_objects
);

self.core.run(req.send().promise)?;

Ok(())
}

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

pub fn wait(&mut self, tasks: &[TaskId], objects: &[DataObjectId]) -> Result<(), Box<Error>> {
let mut req = self.service.wait_request();
capnplist!(req.get(), tasks, init_task_ids);
capnplist!(req.get(), objects, init_object_ids);
to_capnp_list!(req.get(), tasks, init_task_ids);
to_capnp_list!(req.get(), objects, init_object_ids);
self.core.run(req.send().promise)?;
Ok(())
}
Expand All @@ -107,21 +97,13 @@ impl Communicator {
objects: &[DataObjectId],
) -> Result<(Vec<TaskId>, Vec<DataObjectId>), Box<Error>> {
let mut req = self.service.wait_some_request();
capnplist!(req.get(), tasks, init_task_ids);
capnplist!(req.get(), objects, init_object_ids);
to_capnp_list!(req.get(), tasks, init_task_ids);
to_capnp_list!(req.get(), objects, init_object_ids);
let res = self.core.run(req.send().promise)?;

Ok((
res.get()?
.get_finished_tasks()?
.iter()
.map(|id| TaskId::from_capnp(&id))
.collect(),
res.get()?
.get_finished_objects()?
.iter()
.map(|id| DataObjectId::from_capnp(&id))
.collect(),
from_capnp_list!(res.get()?, get_finished_tasks, TaskId),
from_capnp_list!(res.get()?, get_finished_objects, DataObjectId),
))
}

Expand Down
17 changes: 14 additions & 3 deletions src/client/rpc.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ use client::task::TaskInput;
use common::convert::ToCapnp;
use common::id::DataObjectId;

macro_rules! capnplist {
macro_rules! to_capnp_list {
($builder:expr, $items:expr, $name:ident) => {
{
let mut builder = $builder.$name($items.len() as u32);
Expand All @@ -14,6 +14,17 @@ macro_rules! capnplist {
}
}
}
macro_rules! from_capnp_list {
($builder:expr, $items:ident, $obj:ident) => {
{
$builder
.$items()?
.iter()
.map(|item| $obj::from_capnp(&item))
.collect()
}
}
}

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

capnplist!(builder.reborrow(), self.inputs, init_inputs);
capnplist!(
to_capnp_list!(builder.reborrow(), self.inputs, init_inputs);
to_capnp_list!(
builder.reborrow(),
self.outputs
.iter()
Expand Down

0 comments on commit 261ee87

Please sign in to comment.