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