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