mirror of
https://github.com/OMGeeky/tarpc.git
synced 2026-01-01 17:14:32 +01:00
It's strictly more flexible, because everything that impls Future impls IntoFuture, and it additionally allows returning types like Result. Which is nice.
46 lines
1.3 KiB
Rust
46 lines
1.3 KiB
Rust
// Copyright 2016 Google Inc. All Rights Reserved.
|
|
//
|
|
// Licensed under the MIT License, <LICENSE or http://opensource.org/licenses/MIT>.
|
|
// This file may not be copied, modified, or distributed except according to those terms.
|
|
|
|
#![feature(conservative_impl_trait, plugin)]
|
|
#![plugin(tarpc_plugins)]
|
|
|
|
extern crate futures;
|
|
#[macro_use]
|
|
extern crate tarpc;
|
|
extern crate tokio_core;
|
|
|
|
use futures::Future;
|
|
use tarpc::{client, server};
|
|
use tarpc::client::future::Connect;
|
|
use tarpc::util::{FirstSocketAddr, Never};
|
|
use tokio_core::reactor;
|
|
|
|
service! {
|
|
rpc hello(name: String) -> String;
|
|
}
|
|
|
|
#[derive(Clone)]
|
|
struct HelloServer;
|
|
|
|
impl FutureService for HelloServer {
|
|
type HelloFut = Result<String, Never>;
|
|
|
|
fn hello(&self, name: String) -> Self::HelloFut {
|
|
Ok(format!("Hello, {}!", name))
|
|
}
|
|
}
|
|
|
|
fn main() {
|
|
let addr = "localhost:10000".first_socket_addr();
|
|
let mut core = reactor::Core::new().unwrap();
|
|
HelloServer.listen(addr, server::Options::default().handle(core.handle())).wait().unwrap();
|
|
let options = client::Options::default().handle(core.handle());
|
|
core.run(FutureClient::connect(addr, options)
|
|
.map_err(tarpc::Error::from)
|
|
.and_then(|client| client.hello("Mom".to_string()))
|
|
.map(|resp| println!("{}", resp)))
|
|
.unwrap();
|
|
}
|