integrationos_domain/algebra/
fetcher.rs

1use 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}