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] 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