1 use tonic::{transport::Server, Request, Response, Status};
2
3 pub mod hello_world {
4 tonic::include_proto!("helloworld");
5 }
6
7 pub mod echo {
8 tonic::include_proto!("grpc.examples.unaryecho");
9 }
10
11 use hello_world::{
12 greeter_server::{Greeter, GreeterServer},
13 HelloReply, HelloRequest,
14 };
15
16 use echo::{
17 echo_server::{Echo, EchoServer},
18 EchoRequest, EchoResponse,
19 };
20
21 #[tokio::main]
main() -> Result<(), Box<dyn std::error::Error>>22 async fn main() -> Result<(), Box<dyn std::error::Error>> {
23 let addr = "[::1]:50051".parse().unwrap();
24
25 let greeter = GreeterServer::new(MyGreeter::default());
26 let echo = EchoServer::new(MyEcho::default());
27
28 Server::builder()
29 .add_service(greeter)
30 .add_service(echo)
31 .serve(addr)
32 .await?;
33
34 Ok(())
35 }
36
37 #[derive(Default)]
38 pub struct MyGreeter {}
39
40 #[tonic::async_trait]
41 impl Greeter for MyGreeter {
say_hello( &self, request: Request<HelloRequest>, ) -> Result<Response<HelloReply>, Status>42 async fn say_hello(
43 &self,
44 request: Request<HelloRequest>,
45 ) -> Result<Response<HelloReply>, Status> {
46 let reply = hello_world::HelloReply {
47 message: format!("Hello {}!", request.into_inner().name),
48 };
49 Ok(Response::new(reply))
50 }
51 }
52
53 #[derive(Default)]
54 pub struct MyEcho {}
55
56 #[tonic::async_trait]
57 impl Echo for MyEcho {
unary_echo( &self, request: Request<EchoRequest>, ) -> Result<Response<EchoResponse>, Status>58 async fn unary_echo(
59 &self,
60 request: Request<EchoRequest>,
61 ) -> Result<Response<EchoResponse>, Status> {
62 let message = request.into_inner().message;
63 Ok(Response::new(EchoResponse { message }))
64 }
65 }
66