1 use futures::Stream; 2 use std::pin::Pin; 3 use tonic::{transport::Server, Request, Response, Status}; 4 5 pub mod hello_world { 6 tonic::include_proto!("helloworld"); 7 } 8 9 pub mod echo { 10 tonic::include_proto!("grpc.examples.echo"); 11 } 12 13 use hello_world::{ 14 greeter_server::{Greeter, GreeterServer}, 15 HelloReply, HelloRequest, 16 }; 17 18 use echo::{ 19 echo_server::{Echo, EchoServer}, 20 EchoRequest, EchoResponse, 21 }; 22 23 type ResponseStream = Pin<Box<dyn Stream<Item = Result<EchoResponse, Status>> + Send + Sync>>; 24 25 #[tokio::main] 26 async fn main() -> Result<(), Box<dyn std::error::Error>> { 27 let addr = "[::1]:50051".parse().unwrap(); 28 29 let greeter = GreeterServer::new(MyGreeter::default()); 30 let echo = EchoServer::new(MyEcho::default()); 31 32 Server::builder() 33 .add_service(greeter) 34 .add_service(echo) 35 .serve(addr) 36 .await?; 37 38 Ok(()) 39 } 40 41 #[derive(Default)] 42 pub struct MyGreeter {} 43 44 #[tonic::async_trait] 45 impl Greeter for MyGreeter { 46 async fn say_hello( 47 &self, 48 request: Request<HelloRequest>, 49 ) -> Result<Response<HelloReply>, Status> { 50 let reply = hello_world::HelloReply { 51 message: format!("Hello {}!", request.into_inner().name), 52 }; 53 Ok(Response::new(reply)) 54 } 55 } 56 57 #[derive(Default)] 58 pub struct MyEcho; 59 60 #[tonic::async_trait] 61 impl Echo for MyEcho { 62 async fn unary_echo( 63 &self, 64 request: Request<EchoRequest>, 65 ) -> Result<Response<EchoResponse>, Status> { 66 let message = request.into_inner().message; 67 Ok(Response::new(EchoResponse { message })) 68 } 69 70 type ServerStreamingEchoStream = ResponseStream; 71 72 async fn server_streaming_echo( 73 &self, 74 _: Request<EchoRequest>, 75 ) -> Result<Response<Self::ServerStreamingEchoStream>, Status> { 76 Err(Status::unimplemented("Not yet implemented")) 77 } 78 79 async fn client_streaming_echo( 80 &self, 81 _: Request<tonic::Streaming<EchoRequest>>, 82 ) -> Result<Response<EchoResponse>, Status> { 83 Err(Status::unimplemented("Not yet implemented")) 84 } 85 86 type BidirectionalStreamingEchoStream = ResponseStream; 87 88 async fn bidirectional_streaming_echo( 89 &self, 90 _: Request<tonic::Streaming<EchoRequest>>, 91 ) -> Result<Response<Self::BidirectionalStreamingEchoStream>, Status> { 92 Err(Status::unimplemented("Not yet implemented")) 93 } 94 } 95