extern crate futures;
extern crate rmp_rpc;
extern crate tokio;
use std::net::SocketAddr;
use futures::{Future, Stream};
use rmp_rpc::{serve, Service, Value};
use tokio::net::TcpListener;
#[derive(Clone)]
pub struct Echo;
impl Service for Echo {
type RequestFuture = Result<Value, Value>;
fn handle_request(&mut self, method: &str, params: &[Value]) -> Self::RequestFuture {
if method != "echo" {
return Err(format!("Unknown method {}", method).into());
}
if let Value::String(ref string) = params[0] {
if let Some(text) = string.as_str() {
return Ok(text.into());
}
}
Err("Invalid argument".into())
}
fn handle_notification(&mut self, method: &str, _: &[Value]) {
println!("{}", method);
}
}
fn main() {
let addr: SocketAddr = "127.0.0.1:54321".parse().unwrap();
let server = TcpListener::bind(&addr)
.unwrap()
.incoming()
.map_err(|e| println!("error on TcpListener: {}", e))
.for_each(move |stream| {
serve(stream, Echo).map_err(|e| println!("server error {}", e))
});
tokio::run(server);
}