xref: /tonic/examples/src/gcp/client.rs (revision a562a3ce)
1 pub mod api {
2     tonic::include_proto!("google.pubsub.v1");
3 }
4 
5 use api::{publisher_client::PublisherClient, ListTopicsRequest};
6 use tonic::{
7     metadata::MetadataValue,
8     transport::{Certificate, Channel, ClientTlsConfig},
9     Request,
10 };
11 
12 const ENDPOINT: &str = "https://pubsub.googleapis.com";
13 
14 #[tokio::main]
15 async fn main() -> Result<(), Box<dyn std::error::Error>> {
16     let token = std::env::var("GCP_AUTH_TOKEN").map_err(|_| {
17         "Pass a valid 0Auth bearer token via `GCP_AUTH_TOKEN` environment variable.".to_string()
18     })?;
19 
20     let project = std::env::args()
21         .nth(1)
22         .ok_or_else(|| "Expected a project name as the first argument.".to_string())?;
23 
24     let bearer_token = format!("Bearer {}", token);
25     let header_value: MetadataValue<_> = bearer_token.parse()?;
26 
27     let certs = tokio::fs::read("examples/data/gcp/roots.pem").await?;
28 
29     let tls_config = ClientTlsConfig::new()
30         .ca_certificate(Certificate::from_pem(certs.as_slice()))
31         .domain_name("pubsub.googleapis.com");
32 
33     let channel = Channel::from_static(ENDPOINT)
34         .tls_config(tls_config)?
35         .connect()
36         .await?;
37 
38     let mut service = PublisherClient::with_interceptor(channel, move |mut req: Request<()>| {
39         req.metadata_mut()
40             .insert("authorization", header_value.clone());
41         Ok(req)
42     });
43 
44     let response = service
45         .list_topics(Request::new(ListTopicsRequest {
46             project: format!("projects/{0}", project),
47             page_size: 10,
48             ..Default::default()
49         }))
50         .await?;
51 
52     println!("RESPONSE={:?}", response);
53 
54     Ok(())
55 }
56