1 use tonic_types::{ErrorDetail, StatusExt};
2 
3 use hello_world::greeter_client::GreeterClient;
4 use hello_world::HelloRequest;
5 
6 pub mod hello_world {
7     tonic::include_proto!("helloworld");
8 }
9 
10 #[tokio::main]
main() -> Result<(), Box<dyn std::error::Error>>11 async fn main() -> Result<(), Box<dyn std::error::Error>> {
12     let mut client = GreeterClient::connect("http://[::1]:50051").await?;
13 
14     let request = tonic::Request::new(HelloRequest {
15         // Valid request
16         // name: "Tonic".into(),
17         // Name cannot be empty
18         name: "".into(),
19         // Name is too long
20         // name: "some excessively long name".into(),
21     });
22 
23     let response = match client.say_hello(request).await {
24         Ok(response) => response,
25         Err(status) => {
26             println!(" Error status received. Extracting error details...\n");
27 
28             let err_details = status.get_error_details_vec();
29 
30             for (i, err_detail) in err_details.iter().enumerate() {
31                 println!("err_detail[{i}]");
32                 match err_detail {
33                     ErrorDetail::BadRequest(bad_request) => {
34                         // Handle bad_request details
35                         println!(" {:?}", bad_request);
36                     }
37                     ErrorDetail::Help(help) => {
38                         // Handle help details
39                         println!(" {:?}", help);
40                     }
41                     ErrorDetail::LocalizedMessage(localized_message) => {
42                         // Handle localized_message details
43                         println!(" {:?}", localized_message);
44                     }
45                     _ => {}
46                 }
47             }
48 
49             println!();
50 
51             return Ok(());
52         }
53     };
54 
55     println!(" Successful response received.\n\n {:?}\n", response);
56 
57     Ok(())
58 }
59