1 use std::error::Error; 2 3 use tonic::transport::Server; 4 5 use proto_bindings::proto::greeter_server::GreeterServer; 6 7 use crate::server::MyGreeter; 8 9 mod server; 10 mod shutdown_utils; 11 12 // https://github.com/hyperium/tonic/blob/master/examples/src/helloworld/server.rs 13 #[tokio::main] main() -> Result<(), Box<dyn Error>>14async fn main() -> Result<(), Box<dyn Error>> { 15 let addr = "[::1]:5042" 16 .parse() 17 .expect("[Server]: Failed to parse socket address"); 18 19 let grpc_svc = GreeterServer::new(MyGreeter::new()); 20 21 // Shutdown signal handler 22 let signal = shutdown_utils::signal_handler("gRPC Greeter server"); 23 24 let grpc_server = Server::builder() 25 .add_service(grpc_svc) 26 .serve_with_shutdown(addr, signal); 27 28 let grpc_handle = tokio::spawn(grpc_server); 29 30 println!("GreeterServer listening on {}", addr); 31 match tokio::try_join!(grpc_handle) { 32 Ok(_) => {} 33 Err(e) => { 34 println!("[Server]: Error: Failed to start gRPC Greeter server."); 35 println!("[Server]: Error: {:?}", e); 36 } 37 } 38 39 Ok(()) 40 } 41