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 .skip(1) 22 .next() 23 .ok_or("Expected a project name as the first argument.".to_string())?; 24 25 let bearer_token = format!("Bearer {}", token); 26 let header_value = MetadataValue::from_str(&bearer_token)?; 27 28 let certs = tokio::fs::read("examples/data/gcp/roots.pem").await?; 29 30 let tls_config = ClientTlsConfig::new() 31 .ca_certificate(Certificate::from_pem(certs.as_slice())) 32 .domain_name("pubsub.googleapis.com"); 33 34 let channel = Channel::from_static(ENDPOINT) 35 .tls_config(tls_config)? 36 .connect() 37 .await?; 38 39 let mut service = PublisherClient::with_interceptor(channel, move |mut req: Request<()>| { 40 req.metadata_mut() 41 .insert("authorization", header_value.clone()); 42 Ok(req) 43 }); 44 45 let response = service 46 .list_topics(Request::new(ListTopicsRequest { 47 project: format!("projects/{0}", project), 48 page_size: 10, 49 ..Default::default() 50 })) 51 .await?; 52 53 println!("RESPONSE={:?}", response); 54 55 Ok(()) 56 } 57