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 {
say_hello( &self, request: Request<HelloRequest>, ) -> Result<Response<HelloResponse>, Status>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]
main() -> Result<(), Box<dyn std::error::Error>>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