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