// Copyright 2017 PingCAP, Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // See the License for the specific language governing permissions and // limitations under the License. #![allow(unknown_lints)] #![allow(unreadable_literal)] extern crate futures; extern crate grpcio; extern crate grpcio_proto; #[macro_use] extern crate log; #[path = "../log_util.rs"] mod log_util; use std::io::Read; use std::sync::Arc; use std::{io, thread}; use futures::Future; use futures::sync::oneshot; use grpcio::{Environment, RpcContext, ServerBuilder, UnarySink}; use grpcio_proto::example::helloworld::{HelloReply, HelloRequest}; use grpcio_proto::example::helloworld_grpc::{self, Greeter}; #[derive(Clone)] struct GreeterService; impl Greeter for GreeterService { fn say_hello(&self, ctx: RpcContext, req: HelloRequest, sink: UnarySink) { let msg = format!("Hello {}", req.get_name()); let mut resp = HelloReply::new(); resp.set_message(msg); let f = sink.success(resp) .map_err(move |e| error!("failed to reply {:?}: {:?}", req, e)); ctx.spawn(f) } } fn main() { let _guard = log_util::init_log(None); let env = Arc::new(Environment::new(1)); let service = helloworld_grpc::create_greeter(GreeterService); let mut server = ServerBuilder::new(env) .register_service(service) .bind("127.0.0.1", 50051) .build() .unwrap(); server.start(); for &(ref host, port) in server.bind_addrs() { info!("listening on {}:{}", host, port); } let (tx, rx) = oneshot::channel(); thread::spawn(move || { info!("Press ENTER to exit..."); let _ = io::stdin().read(&mut [0]).unwrap(); tx.send(()) }); let _ = rx.wait(); let _ = server.shutdown().wait(); }