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