Skip to content

Commit f1b7072

Browse files
committed
[api] add basic Rust client interface
1 parent 541e17f commit f1b7072

4 files changed

Lines changed: 68 additions & 0 deletions

File tree

src/client/client.rs

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
use capnp::capability::Promise;
2+
use capnp_rpc::rpc_twoparty_capnp;
3+
use common::rpc::new_rpc_system;
4+
use futures::Future;
5+
use std::error::Error;
6+
use std::net::SocketAddr;
7+
use tokio_core::net::TcpStream;
8+
use tokio_core::reactor::Core;
9+
10+
use CLIENT_PROTOCOL_VERSION;
11+
use super::session::Session;
12+
13+
pub struct Client {
14+
core: Core,
15+
service: ::client_capnp::client_service::Client,
16+
}
17+
18+
impl Client {
19+
pub fn new(scheduler: &SocketAddr) -> Result<Self, Box<Error>> {
20+
let mut core = Core::new()?;
21+
let handle = core.handle();
22+
let stream = core.run(TcpStream::connect(&scheduler, &handle))?;
23+
stream.set_nodelay(true)?;
24+
25+
debug!("Connection to server {} established", scheduler);
26+
27+
let mut rpc = Box::new(new_rpc_system(stream, None));
28+
let bootstrap: ::server_capnp::server_bootstrap::Client =
29+
rpc.bootstrap(rpc_twoparty_capnp::Side::Server);
30+
handle.spawn(rpc.map_err(|err| panic!("RPC error: {}", err)));
31+
32+
let mut request = bootstrap.register_as_client_request();
33+
request.get().set_version(CLIENT_PROTOCOL_VERSION);
34+
35+
let service = core.run(
36+
request
37+
.send()
38+
.promise
39+
.and_then(|response| Promise::ok(pry!(response.get()).get_service())),
40+
)??;
41+
42+
Ok(Client { core, service })
43+
}
44+
45+
pub fn new_session(&mut self) -> Result<Session, Box<Error>> {
46+
let id: i32 = self.core.run(
47+
self.service
48+
.new_session_request()
49+
.send()
50+
.promise
51+
.and_then(|response| Promise::ok(pry!(response.get()).get_session_id())),
52+
)?;
53+
54+
Ok(Session { id })
55+
}
56+
57+
pub fn terminate_server(&mut self) -> Result<(), Box<Error>> {
58+
self.core
59+
.run(self.service.terminate_server_request().send().promise)?;
60+
Ok(())
61+
}
62+
}

src/client/mod.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
pub mod client;
2+
pub mod session;

src/client/session.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
pub struct Session {
2+
pub id: i32,
3+
}

src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ extern crate tokio_timer;
3333
extern crate tokio_uds;
3434
extern crate walkdir;
3535

36+
pub mod client;
3637
pub mod common;
3738
pub mod worker;
3839
pub mod server;

0 commit comments

Comments
 (0)