|
| 1 | +use tokio_stream::StreamExt; |
| 2 | +use tonic_reflection::pb::{ |
| 3 | + server_reflection_client::ServerReflectionClient, server_reflection_request::MessageRequest, |
| 4 | + server_reflection_response::MessageResponse, ServerReflectionRequest, ServerReflectionResponse, |
| 5 | +}; |
| 6 | + |
| 7 | +fn parse_response(resp: ServerReflectionResponse) { |
| 8 | + let message_response = resp.message_response.expect("message response"); |
| 9 | + |
| 10 | + if let MessageResponse::ListServicesResponse(list_response) = message_response { |
| 11 | + for svc in list_response.service { |
| 12 | + println!("\tfound service: `{}`", svc.name); |
| 13 | + } |
| 14 | + } |
| 15 | +} |
| 16 | + |
| 17 | +#[tokio::main] |
| 18 | +async fn main() -> Result<(), Box<dyn std::error::Error>> { |
| 19 | + let conn = tonic::transport::Endpoint::new("http://[::1]:50052")? |
| 20 | + .connect() |
| 21 | + .await?; |
| 22 | + |
| 23 | + let mut client = ServerReflectionClient::new(conn); |
| 24 | + |
| 25 | + let list_services_request = ServerReflectionRequest { |
| 26 | + host: "host".into(), |
| 27 | + message_request: Some(MessageRequest::ListServices("list".into())), |
| 28 | + }; |
| 29 | + |
| 30 | + let request_stream = tokio_stream::once(list_services_request); |
| 31 | + let mut inbound = client |
| 32 | + .server_reflection_info(request_stream) |
| 33 | + .await? |
| 34 | + .into_inner(); |
| 35 | + |
| 36 | + while let Some(recv) = inbound.next().await { |
| 37 | + match recv { |
| 38 | + Ok(resp) => parse_response(resp), |
| 39 | + Err(e) => println!("\tdid not receive response due to error: `{}`", e), |
| 40 | + } |
| 41 | + } |
| 42 | + |
| 43 | + Ok(()) |
| 44 | +} |
0 commit comments