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]
main() -> Result<(), Box<dyn std::error::Error>>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 data_dir = std::path::PathBuf::from_iter([std::env!("CARGO_MANIFEST_DIR"), "data"]);
28 let certs = std::fs::read_to_string(data_dir.join("gcp/roots.pem"))?;
29
30 let tls_config = ClientTlsConfig::new()
31 .ca_certificate(Certificate::from_pem(certs))
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