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