xref: /tonic/examples/src/multiplex/server.rs (revision 44aa46db)
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]
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 {
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 {
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