xref: /tonic/examples/src/json-codec/server.rs (revision 44aa46db)
1 //! A HelloWorld example that uses JSON instead of protobuf as the message serialization format.
2 //!
3 //! Generated code is the output of codegen as defined in the `build_json_codec_service` function
4 //! in the `examples/build.rs` file. As defined there, the generated code assumes that a module
5 //! `crate::common` exists which defines `HelloRequest`, `HelloResponse`, and `JsonCodec`.
6 
7 use tonic::{transport::Server, Request, Response, Status};
8 
9 pub mod common;
10 use common::{HelloRequest, HelloResponse};
11 
12 pub mod hello_world {
13     include!(concat!(env!("OUT_DIR"), "/json.helloworld.Greeter.rs"));
14 }
15 use hello_world::greeter_server::{Greeter, GreeterServer};
16 
17 #[derive(Default)]
18 pub struct MyGreeter {}
19 
20 #[tonic::async_trait]
21 impl Greeter for MyGreeter {
22     async fn say_hello(
23         &self,
24         request: Request<HelloRequest>,
25     ) -> Result<Response<HelloResponse>, Status> {
26         println!("Got a request from {:?}", request.remote_addr());
27 
28         let reply = HelloResponse {
29             message: format!("Hello {}!", request.into_inner().name),
30         };
31         Ok(Response::new(reply))
32     }
33 }
34 
35 #[tokio::main]
36 async fn main() -> Result<(), Box<dyn std::error::Error>> {
37     let addr = "[::1]:50051".parse().unwrap();
38     let greeter = MyGreeter::default();
39 
40     println!("GreeterServer listening on {}", addr);
41 
42     Server::builder()
43         .add_service(GreeterServer::new(greeter))
44         .serve(addr)
45         .await?;
46 
47     Ok(())
48 }
49