xref: /tonic/examples/src/richer-error/client.rs (revision 680214b5)
1 use tonic_types::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();
29 
30             if let Some(bad_request) = err_details.bad_request() {
31                 // Handle bad_request details
32                 println!(" {:?}", bad_request);
33             }
34             if let Some(help) = err_details.help() {
35                 // Handle help details
36                 println!(" {:?}", help);
37             }
38             if let Some(localized_message) = err_details.localized_message() {
39                 // Handle localized_message details
40                 println!(" {:?}", localized_message);
41             }
42 
43             println!();
44 
45             return Ok(());
46         }
47     };
48 
49     println!(" Successful response received.\n\n {:?}\n", response);
50 
51     Ok(())
52 }
53