integrationos_domain/algebra/
fetcher.rs1use anyhow::Result;
2use async_trait::async_trait;
3use reqwest::Client;
4use serde::Deserialize;
5
6const URL: &str =
7 "http://metadata/computeMetadata/v1/instance/service-accounts/default/identity?audience=";
8const HEADER_KEY: &str = "Metadata-Flavor";
9const HEADER_VALUE: &str = "Google";
10
11#[async_trait]
12pub trait FecherExt {
13 async fn get_token(&self, url: &str) -> Result<String>;
14}
15
16#[derive(Debug, Clone, Deserialize)]
17pub struct GoogleTokenResponse {
18 data: String,
19}
20
21#[derive(Debug, Clone, Default)]
22pub struct GoogleTokenFetcher {
23 client: Client,
24}
25
26#[async_trait]
27impl FecherExt for GoogleTokenFetcher {
28 async fn get_token(&self, url: &str) -> Result<String> {
29 let res = self
30 .client
31 .get(format!("{URL}{url}"))
32 .header(HEADER_KEY, HEADER_VALUE)
33 .send()
34 .await?
35 .json::<GoogleTokenResponse>()
36 .await?;
37
38 Ok(format!("Bearer {}", res.data))
39 }
40}
41
42impl GoogleTokenFetcher {
43 pub fn new() -> Self {
44 Self {
45 client: Client::new(),
46 }
47 }
48}